Проблема с чтение датчика 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 не устраивает ? дешевле и компактнее
Да досталась пачка промини, мег и унок на халяву. Вот и пользую. За подсказку спасибо!