Проблема с чтение датчика DHT22 и передачей результата на другую Ардуино через радиоканал 433.
- Войдите на сайт для отправки комментариев
Всем доброго времени суток! Сразу оговорюсь, я новичек в программировании, и если моя ошибка ниже является полной глупостью - извините. Готов принимать тухлые помидоры и жженые микросхемы.
Проблему по сути решил, но с использованием костыля. Хотелось бы узнать, как написать программку красиво и в чем моя ошибка.
Изначально основа кода взята отсюда http://homes-smart.ru/index.php/oborudovanie/bez-provodov-433-315mgts/45-odin-iz-algoritmov-peredachi-dannykh-v-vide-tsifrovogo-koda
И так чуть подправив код под свои нужды, залил его в промини, висящую за окном с датчиком DHT22. Код передатчика:
#include <RCSwitch.h> #include <DHT.h> DHT dht; RCSwitch mySwitch = RCSwitch(); float hmdt = dht.getHumidity(); float temp = dht.getTemperature(); #define key1 300000 #define key2 303000 void setup() { dht.setup(7); // пин датчика DHT22 mySwitch.enableTransmit(8); // пин,на который подключен передатчик } void loop() { float hmdt = dht.getHumidity(); float temp = dht.getTemperature(); sendRC(hmdt*10+key1+500); //составление числа для передачи с ключем и антиминусом (влажность) delay(dht.getMinimumSamplingPeriod()); sendRC(temp*10+key2+500); //составление числа для передачи с ключем и антиминусом (температура) delay(dht.getMinimumSamplingPeriod()); } void sendRC(unsigned long code) { mySwitch.send(code, 20); }
Код приемника:
#include <RCSwitch.h> #include <DHT.h> RCSwitch mySwitch = RCSwitch(); DHT dht; float hmdt=0,temp=0; float temperature; float humidity; #define key1 300000 // датчик влажности #define key2 303000 // датчик температуры void setup() { Serial.begin(9600); Serial.println(); Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)"); mySwitch.enableReceive(0); } void loop() { if (mySwitch.available()) { unsigned long receivedCode= mySwitch.getReceivedValue(); if (receivedCode == 0) { } else { if (key1<=receivedCode && key1+999>receivedCode) hmdt=(receivedCode-key1-500)/10; //определение сигнала влажность и удаление ключа else if (key2<=receivedCode && key2+999>receivedCode) temp=(receivedCode-key2-500)/10; //определение сигнала температура и удаление ключа } Serial.print(dht.getStatusString()); Serial.print("\t"); Serial.print(hmdt); Serial.print("\t\t"); Serial.print(temp); Serial.print("\t\t"); Serial.println(dht.toFahrenheit(temp), 1); } mySwitch.resetAvailable(); // сброс данных. }
И все бы ничего, но когда температура уходила в минус, температура переставала приходить адекватно, вместо например -1.4 приходило нечто подобное 429496736.00.
Потанцевав пол часика с бубном и изменив кусочек кода с обратным преобразованием данных датчика на такой:
if (key1<=receivedCode && key1+999>receivedCode) hmdt=(receivedCode-key1); //определение сигнала влажность и удаление ключа else if (key2<=receivedCode && key2+999>receivedCode) temp=(receivedCode-key2); //определение сигнала температура и удаление ключа temperature=(temp-500)/10; //обратные вычисления после передачи (почемуто не работают в одной строке с удалением ключа) humidity=(hmdt-500)/10; //обратные вычисления после передачи (почемуто не работают в одной строке с удалением ключа)
я получил желаемый результат. По сути я лишь вынес удаление сервисных чисел в отдельные строки и все заработало.
Засим вопрос - где моя ошибка? почему отрицательная температура отказывается нормально обратно считаться в одну строку?
Насколько я помню надо задать как-то так temp=((float)receivedCode-key2))/10;
Для влажности вычитание/прибавление 500 не нужно.
Это моя стататья ) Давненько уже писал. А чем вариант на attiny не устраивает ? дешевле и компактнее
Да досталась пачка промини, мег и унок на халяву. Вот и пользую. За подсказку спасибо!