Слушай дружище а что это у него за дисплей с кнопками, его где то купить можно или его следует самому сделать, поделись информацией.
Код (C++): #include <DHT.h>; //Constants #define DHTPIN 2 //what pin we're connected to #define DHTTYPE DHT21 //DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); //Initialize DHT sensor for normal 16mhz Arduino #include <Wire.h> // библиотека для управления устройствами по I2C #include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602 LiquidCrystal_I2C LCD(0x3F,16,2); // присваиваем имя LCD для дисплея //Variables float hum; //Stores humidity value float temp; //Stores temperature value void setup() { LCD.init(); // инициализация LCD дисплея Serial.begin(9600); dht.begin(); pinMode(LED_BUILTIN, OUTPUT); pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(3, OUTPUT); digitalWrite (4, HIGH); digitalWrite (3, LOW); LCD.backlight(); // включение подсветки дисплея } void loop() { //Read data and store it to variables hum and temp hum = dht.readHumidity(); temp= dht.readTemperature(); //Print temp and humidity values to serial monitor if (isnan(temp)) { digitalWrite(5, HIGH); LCD.clear(); Serial.println("Failed to read"); LCD.print("Failed to read"); // печатаем сообщение на второй строке digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } else { digitalWrite (4, HIGH); digitalWrite (3, LOW); Serial.print("Humidity: "); Serial.print(hum); Serial.print("%, Temperature: "); Serial.print(temp); Serial.println(" Celsius"); LCD.clear(); LCD.setCursor(1, 0); // ставим курсор на 1 символ первой строки LCD.print("Temp= "); // печатаем сообщение на первой строке LCD.print(temp); LCD.setCursor(1, 1); // ставим курсор на 1 символ второй строки LCD.print("Humidity= "); // печатаем сообщение на второй строке LCD.print(hum); if (temp>29) { //при такой программе если датчик отлетает и показатель равен нон то реле офф digitalWrite(5, HIGH); digitalWrite(LED_BUILTIN, HIGH); } if (temp<27) { digitalWrite(5, LOW); digitalWrite(LED_BUILTIN, LOW); } delay(4000); LCD.clear(); } }
В этот loop закинь такую фишку - на дисплее мигает любая точка. Когда тебе кажется, что Ардуино "висит", посмотри, мигает ли при этом точка. А вообще, следует писать код так, чтобы в нем никогда не было функции delay(). delay() - это зло.
Если накатить, то тут вообще много сюрпризов всплывает. Как мне кажется - самая главная проблема - с постоянной памятью, что то типа проблемы с RAID. Очень похоже на проблему с батарейкой. Вроде в кэш все пишется, а на утро выясняется, что кэш сбросился и на SSD не записался
Это LCD шилд. Хорошая штука между прочим! Нахлобучивается на УНО можно еще для УНЫ пластиковый кейс за 100 рублей и вот готовая конструкция. И корпуса ненадо. Продается на Али я раньше покупал а потом сам паял. У Zelectro на сайте есть чертеж платы в PDF для принтера. Если дружишь с ЛУТ и паяльником то можешь и сам сделать.
Блокирующая выполнение потока инструкция. А т.к. поток один, то блокируется выполнение и всего остального. Делается очень просто: создаётся таймер. Этот таймер следит за глобальным флагом. Через определенные промежутки времени он его инвертирует. В коде этот флаг достаточно связать по И, чтобы что-то выполнить.
Вот правильный ответ: Вот мой неправильный ответ: Если вы делаете одно устройство и идете вышивать крестиком на все остальное время, то "и так сойдет". Если же вы решите сделать нечто, что имеет больше одного "потока действий", то вы вынуждены не останавливать процессор, а переключать его по времени между задачами, о чем и сказано выше. В общем случае, лучше сразу "упереться" и отказаться от delay(...), научиться писать код без "тормозов".
Нет. Он тупо занимается пересчетом того числа которое delay (число) ему пихнули. И больше ничем. Это в двух словах.
По таймеру останавливает выполнение всего кода. В некоторых случаях это не влияет ни на что, но в большинстве ситуаций - это "ломает" все.
Спойлер: * я где-то читал он noop считает - такты пустые, там еще рассчёт в зависимости от частоты тактирования Просто если поразмышлять зачем нужна задержка в программе опытному любителю-разработчику?
Помня, что delay() вызывает yield() залез глянул исходник delay() Вот он: Код (C++): void delay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } } То есть управление постоянно отдается yield() Если yield() в коде отсутствует, то ничего не выполняется. Ради прикола поправил блинк без delay() до такого варианта: Код (C++): const int ledPin = LED_BUILTIN;// the number of the LED pin // Variables will change: int ledState = LOW; // ledState used to set the LED // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store // constants won't change: const long interval = 1000; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); } void loop() { delay (10000); } void yield() { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState); } } Залил в нано. Мигает встроенный светодиод каждую секунду. UPD: Понятно, что delay() зло, и в коде его не должно быть. Вот думаю зачем прикрутили вызов yield(), наверное если только для библиотек. Ведь если кто-то использует delay(), то он явно не знает про yield()