Гуру помогите немного с умным кодом. Вообщем задача следующая есть два датчика 18b20, lcd nokia 5510, и одно реле. Необходимо на экран выводить температуру с двух датчиков, сначала одна n-секунды, потом вторая n-секунд, при достижении определенной температуры давать на реле контакт на отключение, и держать пока тот не остынет на 2 градуса. В меру своих возможностей я немного помучился и вышло такое, но работает оно как то коряво. Не могу понять как прикруть чтобы когда сработало по первой температуре, не выключалось от второй, так как на ней может быть меньше. И + есть некая инерционность, но честно она меня не особо волнует, понимаю что она из за delay 1000, но если есть какойто умный метод его исправить, то подскажите пожалуйста. Спасибо А код собирался отовсюду и создавалось с помощью copy-past Код (Text): /* niq_ro ( http://nicuflorica.blogspot.ro ) case for Nokia 5110 LCD (PCD8544) - LPH 7366: For module from China, you must connect like this: * Pin 1 (RST) -> Arduino digital 6 (D6) * Pin 2 (CE) -> Arduino digital 7 (D7) * Pin 3 (DC) -> Arduino digital 5 (D5) * Pin 4 (DIN) -> Arduino digital 4 (D4) * Pin 5 (CLK) - Arduino digital 3 (D3) * Pin 6 (Vcc) -> +5V thru adaptor module (see http://nicuflorica.blogspot.ro/2013/06/afisajul-folosit-la-telefoanele-nokia.html ) * Pin 7 (LIGHT) -> +5V thru 56-100 ohms resistor (for permanent lights) or... other pin control * Pin 8 (GND) -> GND1 or GND2 */ // version 0.1 #include <Adafruit_GFX.h> // подключаю графическую библиотеку экрана #include <Adafruit_PCD8544.h> // подключаю библиотеку инициализации экрана #include <DallasTemperature.h> // подключаем библиотеку для датчика DALLAS #include <OneWire.h> // подключаем интерфейс OneWire #define ONE_WIRE_BUS 2 // датчик линия дата садим на 2 ногу Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6); // Adafruit_PCD8544 display = Adafruit_PCD8544(SCLK, DIN, DC, CS, RST); OneWire oneWire(ONE_WIRE_BUS); // незнаю для чего но надо DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature. int t_1_pered; //переменная для датчика №1 int t_2_zad; // переменная для датчика №2 int led = 13; static unsigned char PROGMEM pered[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0xFF, 0xCF, 0xE1, 0xFF, 0x8F, 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0xFF, 0xCF, 0xF1, 0xFF, 0x8F, 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0xFF, 0xCF, 0xF9, 0xFF, 0x8F, 0xF8, 0x00, 0x00, 0x0E, 0x0C, 0xE0, 0x0E, 0x39, 0xC0, 0x0C, 0x38, 0x00, 0x00, 0x0E, 0x0C, 0xE0, 0x0E, 0x39, 0xC0, 0x0C, 0x38, 0x00, 0x00, 0x0E, 0x0C, 0xFF, 0xCF, 0xF9, 0xFF, 0x8C, 0x38, 0x00, 0x00, 0x0E, 0x0C, 0xFF, 0xCF, 0xF1, 0xFF, 0x8C, 0x38, 0x00, 0x03, 0xEE, 0x0C, 0xFF, 0xCF, 0xE1, 0xFF, 0x8C, 0x39, 0xF0, 0x03, 0xEE, 0x0C, 0xE0, 0x0E, 0x01, 0xC0, 0x18, 0x39, 0xF0, 0x03, 0xEE, 0x0C, 0xE0, 0x0E, 0x01, 0xC0, 0x18, 0x39, 0xF0, 0x00, 0x0E, 0x0C, 0xFF, 0xCE, 0x01, 0xFF, 0xBF, 0xFC, 0x00, 0x00, 0x0E, 0x0C, 0xFF, 0xCE, 0x01, 0xFF, 0xBF, 0xFC, 0x00, 0x00, 0x0E, 0x0C, 0xFF, 0xCE, 0x01, 0xFF, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // текст ПЕРЕД static unsigned char PROGMEM zad[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0x81, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x0F, 0x81, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x0F, 0x81, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8E, 0x1D, 0x81, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x1D, 0x81, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1D, 0x81, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x38, 0xC1, 0xC3, 0x80, 0x00, 0x00, 0x0F, 0xBE, 0xF8, 0x0E, 0x3F, 0xC1, 0xC3, 0x9E, 0xFB, 0xE0, 0x0F, 0xBE, 0xFB, 0x0E, 0x3F, 0xC3, 0x83, 0x9E, 0xFB, 0xE0, 0x0F, 0xBE, 0xFF, 0x8E, 0x7F, 0xE3, 0x83, 0x9E, 0xFB, 0xE0, 0x00, 0x00, 0x03, 0xFE, 0x70, 0x67, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x70, 0x67, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xE0, 0x77, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // текст ЗАД void setup () { Serial.begin(9600); sensors.begin();// инициализация датчика pinMode(led, OUTPUT); display.begin(); // инициализация дисплея display.setContrast(55);// установка контраста дисплея display.clearDisplay(); // очистка дисплея } void loop () { display.clearDisplay(); display.drawBitmap(0, 0, pered, 80, 18, 1); sensors.requestTemperatures(); // опрос датчика display.setTextSize(4); display.setCursor(0,20); t_1_pered=sensors.getTempCByIndex(0); // присваеваем переменной t значения с датчика без десятых display.print(t_1_pered); // выводим на дисплей значения t_1 display.setCursor(60,20); display.print("C"); display.setTextSize(2); display.setCursor(48,20); display.print("o"); display.display(); delay (1000); display.clearDisplay(); display.drawBitmap(0, 0, zad, 80, 18, 1); sensors.requestTemperatures(); // опрос датчика display.setTextSize(4); display.setCursor(0,20); t_2_zad=sensors.getTempCByIndex(1); // присваеваем переменной t значения с датчика без десятых display.print(t_2_zad); // выводим на дисплей значения t display.setCursor(60,20); display.print("C"); display.setTextSize(2); display.setCursor(48,20); display.print("o"); display.display(); delay (1000); if (t_1_pered <30) // если значение температуры датчика № 2 привышает указаное высокий уровень на указаном пине { digitalWrite(led, LOW); } else { digitalWrite(led, HIGH); } }
Я, конечно, не гуру, но в меру своих возможностей... Начнем с конца. Почитал, посмотрел код и не понял, Вы собираетесь что-то нагревать или охлаждать? Если смотреть по коду, то охлаждать. Тогда так: Код (Text): if(t_1_pered > 30) { digitalWrite(led, HIGH); } else if(t_1_pered < 28) { digitalWrite(led, LOW); } что позволит включать (в данном случае светодиод) при 31 и выше и выключать при 27 и ниже. Подкорректируйте под свои цифры. Однако чтоб не дергать пины каждый раз, я бы ввел некий флаг состояния. Скажем, вот таким способом: Код (Text): //объявим глобальную переменную (это наверху, где все переменные), назовем ее, допустим, stSwitch boolean stSwitch=true; .............................. //внедрим наш флаг if(t_1_pered > 30 && stSwitch) { digitalWrite(led, HIGH); stSwitch=false; } else if(t_1_pered < 28 && !stSwitch) { digitalWrite(led, LOW); stSwitch=true; } Хотя и без этого будет работать. По поводу вывода на экран. У Вас два раза практически повторяются одинаковые куски кода, которые занимают на данный момент большую часть программы. Это не есть хорошо. Плюс 2 раза используется delay() по секунде, что в общей сложности дает некую инертность в 2 сек. Может оно и не принципиально, но я бы сделал по-другому. Принцип: используем таймер на основе millis(), вводим два флага. Первый отвечает за то, показания какого датчика в текущий момент должны выводиться на экран, второй - контроль, выведены ли показания (это чтоб постоянно экран не обновлялся, подозреваю, что может мерцать). Так, как датчика у Вас 2, то оба флага вполне могут быть boolean. Пусть выводятся показания первого датчика, если первый флаг - true и второго - если false. Изначально оба флага true. Логика работы: (здесь можно немного укоротить, но чтоб было понятней, напишу чуть подробней) запускаем таймер, проверяем второй флаг (нужно ли выводить инфу?) Если да (флаг true), смотрим первый флаг (с какого датчика выводить?), выводим инфу, второй флаг - false (все, инфа выведена, до окончания таймера больше не выводим). Завершаем все проверки, закрываем все скобки. Проверяем таймер. Если время вышло, обнуляем таймер (т.е. запускаем заново), первый флаг меняем на противоположный (т.е. будем выводить показания второго датчика), второй флаг делаем true (т.е. пора вывести новую инормацию). Как-то так. Уф, проще было код написать )) Попробуйте изобразить, думаю у Вас получится. з.ы. переменные у Вас жуткие... zad, pered....
Спасибо. Но почему то когда делаю такую конструкцию, то срабатывает только по достижению температуры t_2_zad, а мне бы сделать что бы или по t_2_zad или t_1_pered, но отключалось при достижении обоих результатов меньше 29 градусов Код (Text): if (t_1_pered,t_2_zad >30) // если значение температуры датчика № 2 привышает указаное высокий уровень на указанном пине { digitalWrite(led, HIGH); } else if(t_1_pered,t_2_zad < 29) { digitalWrite(led, LOW); }
Объяснять не в состоянии, день тяжелый был. Сделайте так Код (Text): if (t_1_pered > 30 || t_2_zad >30) //любой датчик больше 30 { digitalWrite(led, HIGH); } else if(t_1_pered < 29 && t_2_zad < 29) //оба датчика меньше 29 { digitalWrite(led, LOW); } и почитайте вот это
Спасибо, очень помог. Все работает как надо. Я был на правильном пути, только спутал || ИЛИ такое и вместо такого && И поставил такое | а оно не работало . Теперь все как надо. Спасибо еще раз