Всем привет. Есть такой датчик температуры и влажности. Есть ещё и такой, но его мне вообще завести не удалось (если у кого получилось, дайте знать). Так вот. Проблема следующая, датчик какое-то время снимает показания, всё ок. Но спустя некоторое время (так же за это время происходит понижение температуры градусов на 5-7, т.е. с 28 до 23, например) он просто перестает снимать показания, не может пройти инициализацию. Код следующий: Код (Text): // Импорт необходимых библиотек #include <dht.h> // Распиновка #define DHT_SENSOR_PIN 24 DHT DHTLib; int _indoorTemperature; int _indoorHumidity; void indoorTempInit() { DHTLib.attach(DHT_SENSOR_PIN); } void indoorTempHandler() { DHTLib.update(); if (DHTLib.getLastError() == DHT_ERROR_OK) { _indoorTemperature = constrain(DHTLib.getTemperatureInt(), 0, 40); _indoorHumidity = constrain(DHTLib.getHumidityInt(), 0, 100); } } int getIndoorTemperature() { return _indoorTemperature; } int getIndoorHumidity() { return _indoorHumidity; } Может кто-нибудь сталкивался с таким? В чём может быть причина? P.S. indoorTempInit вызывается в setup(), а indoorTempHandler соответственно в loop()
Хмммм… странно. А вот если температура с 28 до 23 упала, датчик затупил и в этот момент нажать Reset, ситуация нормализуется?
Нет. Ситуация нормализуется после выключения ардуино, подождать минут 5 и включить снова. А вообще интересно по второму датчику узнать, вы пробовали его подключать?
Есть такая же ситуация. Такое ощущение что после определенного количества запросов виснет. Пробовал и ставить опросы раз в минуту. Все равно надолго не хватает. Может ошибки в библиотеке с переполнением стека что-то... Код (Text): #include "etherShield.h" #include "ETHER_28J60.h" #include <dht.h> int s_temp; int s_hum; unsigned long prevMeasureTime = 0; static int MeasureInterval = 1000; // раз в минуту static uint8_t MaxTries = 4; // количество попыток получения данных с датчика static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; static uint8_t ip[4] = {192, 168, 0, 99}; static uint16_t port = 80; ETHER_28J60 e; DHT t_sensor = DHT(); void setup() { e.setup(mac, ip, port); t_sensor.attach(A0); delay(MeasureInterval); MeasureData(); } void loop() { char* params; if (params = e.serviceRequest()) { e.print("<H2>Temperatue: "); e.print(s_temp); e.print("C<br>"); e.print("Humidity: "); e.print(s_hum); e.print("%</H2>"); e.respond(); } MeasureData(); } void MeasureData() { if (abs(millis() - prevMeasureTime) > MeasureInterval) { prevMeasureTime = millis(); for (uint8_t tries = 0; tries < MaxTries; tries++) { t_sensor.update(); if (t_sensor.getLastError() == DHT_ERROR_OK) { s_temp = t_sensor.getTemperatureInt(); s_hum = t_sensor.getHumidityInt(); break; } else delay(100); } } }
Попробуйте поставить отладочные выводы в разных местах программы - поймете, в каком месте и в какой момент программа спотыкается. Попробуйте убрать часть кода, отвечающую за работу с сетью и посмотрите, не изменится ли поведение. Посчитайте количество успешных запросов перед зависанием - всегда ли оно одинаково?
У меня была похожая проблема. В какой-то момент датчик стал выдавать только ошибки. это было с библиотекой https://github.com/amperka/dht (с ней ошибки и так вылезают время от времени) я нашел другую - https://github.com/adafruit/DHT-sensor-library/ - ошибок больше не видел вообще.
Годная библиотека. Достал из нее самое нужное. Перенес в код только читалку с сенсора. В библиотеке ограничивается чтение разом на 2 секунды. Может поэтому не виснет. Код (Text): #include "etherShield.h" #include "ETHER_28J60.h" // how many timing transitions we need to keep track of. 2 * number bits + extra #define MAXTIMINGS 85 #define MeasureInterval 30000 // раз в 30 секунд #define SENSOR_PIN A0 uint8_t s_temp; uint8_t s_hum; unsigned long prevMeasureAttemptTime = 0; static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; static uint8_t ip[4] = {192, 168, 0, 99}; static uint16_t port = 80; ETHER_28J60 e; void setup() { e.setup(mac, ip, port); pinMode(SENSOR_PIN, INPUT); digitalWrite(SENSOR_PIN, HIGH); } void loop() { char* params; char out[128]; if (params = e.serviceRequest()) { e.print("<style>body {font-family:Verdana;backgroung-color:#aaa;} h2 {font-size:16pt;color:red;} h4 {text-size:12pt;color:navy;}</style>"); sprintf(out, "<h2>Temperatue: %uC<br>Humidity: %u</h2><h4>Last Attempt: %u</h4>", s_temp, s_hum, prevMeasureAttemptTime); e.print(out); e.respond(); } MeasureData(); } void MeasureData() { unsigned long _time = millis(); if (_time < prevMeasureAttemptTime ) prevMeasureAttemptTime = 0; if (_time - prevMeasureAttemptTime > MeasureInterval) { prevMeasureAttemptTime = _time; uint8_t data[6], laststate = HIGH, counter = 0, j = 0; data[0] = data[1] = data[2] = data[3] = data[4] = 0; // pull the pin high and wait 250 milliseconds digitalWrite(SENSOR_PIN, HIGH); delay(250); // now pull it low for ~20 milliseconds pinMode(SENSOR_PIN, OUTPUT); digitalWrite(SENSOR_PIN, LOW); delay(20); cli(); digitalWrite(SENSOR_PIN, HIGH); delayMicroseconds(40); pinMode(SENSOR_PIN, INPUT); // read in timings for (uint8_t i = 0; i < MAXTIMINGS; i++) { counter = 0; while (digitalRead(SENSOR_PIN) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) break; } laststate = digitalRead(SENSOR_PIN); if (counter == 255) break; // ignore first 3 transitions if ((i >= 4) && (i%2 == 0)) { // shove each bit into the storage bytes data[j/8] <<= 1; if (counter > 6) data[j/8] |= 1; j++; } } sei(); // check we read 40 bits and that the checksum matches if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { s_hum = data[0]; s_temp = data[2]; } } }