Датчики температуры выдают неправильный результат

Sherzod
Offline
Зарегистрирован: 17.04.2016

Есть 4 датчика температуры: 2 шт. DS18B20 и по одному DHT22 и NTC термистор. Также добавил датчик росы/дождя. На ардуино уно все датчики подключал через W5100 ethernet шилд. Залил скетч чтобы каждые 5 минут отправлял на сервер GET запрос с данными, а php файл на сервере добавляет эти данные в базу. Все работает.

Но теперь захотел изменить логику. Теперь сервер будет каждые 5 минут запрашивать у ардуно данные. На ардуино подключил ENC28J60 и "поднял сервер" по адресу 192.168.1.203. Написал тестовую страничку в скетче. Браузер нормально показывает страницу по адресу 192.168.1.203. Работает. Теперь подключил все те датчики и нужный часть кода тоже со старого скетча скопировал. И тут что то пошло не так. Сначала из 10 попыток 1 раз только открыл страницу 192.168.1.203. И то данные пятизначные не понятные откуда. Например DS18B20 и DHT22 показывают температуру в доме 16844. Подумал модулю ENC28J60 не хватает питание, хотя в обоих случаях ардуино питается от 12В 1А блока питания. Модуль ENC28J60 работает от 3.3В. В проекте от 3.3В также работает и NTC термистор. В общем, отключил NTC термистор и страницу стало открывать нормально. Но данные все те же. Сейчас первая DS18B20 показывает 0, вторая 16836, DHT22 тоже 16836, а влажность вроде нормальные данные 24%, хотя тоже врет думаю. Обычно 30-35%.

В общем, как получить "правильные" данные? Знаю что сервер можно поднять и на W5100, но надо использовать именно ENC28J60.

Logik
Offline
Зарегистрирован: 05.08.2014

Есть волшебное слово отладка. Займитесь ей. Вы думаете софт пишут и он сразу работает?! А потом в него немного ошибок дописывают чтоб разрабов не уволили?!

Идея вебсервака на ардуино пагубна, не невозможна, просто плоха, слабовато оно, брали бы оранжпи было бы менее проблемно даже дешевле.

Sherzod
Offline
Зарегистрирован: 17.04.2016

Logik пишет:
Есть волшебное слово отладка. Займитесь ей. Вы думаете софт пишут и он сразу работает?! А потом в него немного ошибок дописывают чтоб разрабов не уволили?!

В Arduino IDE есть отладчик? Или имеете ввиду монитор порта? Пробовал выводить данные в монитор порта. Что интересно там данные показываются нормально.

Logik пишет:
Идея вебсервака на ардуино пагубна, не невозможна, просто плоха, слабовато оно, брали бы оранжпи было бы менее проблемно даже дешевле.

Честно говоря, не знал про Orange Pi. Спасибо за наводку.
Ардуино и эти датчики просто лежали без дела. Поэтому решил сделать что то полезное, может и не очень, на досуге.

В общем пока решил проблему так: подключил модуль, который получает 5В, а при выходе отдает 3.3В и все компоненты, которые работают от 3.3В запитал через него. А в коде пришлось float на int изменить. Тогда все работает нормально. Теперь ищу как же сохранить и дробные части. Наткнулся на такое:

double d = 2.71;
double x, y;    
y = std::modf(d, &x); // целая часть запишется в x, дробная - в y

Класс std не знаю откуда, может из Math.h, но не работал. std::modf написал просто modf. Компиляция и загрузка идет без ошибок, но ожидаемого результата все равно не получил. Целая часть сохраняется в X, а вот дробная в Y не сохраняется, равно 0.

*****

Решил простым способом:

float ds_temp; //например 25,36
int ds_x = floor(ds_temp); //округляем вниз - целая часть 25
float ds_y_float = (ds_temp - ds_x) * 100; //(25,36 - 25) * 100 = 36
int ds_y = int(ds_y_float); //преобразую в целую, так как флоат нормально не показывает