Проблема с чтение датчика DHT22 и передачей результата на другую Ардуино через радиоканал 433.

pureac1d
Offline
Зарегистрирован: 23.01.2015

Всем доброго времени суток! Сразу оговорюсь, я новичек в программировании, и если моя ошибка ниже является полной глупостью - извините. Готов принимать тухлые помидоры и жженые микросхемы.

Проблему по сути решил, но с использованием костыля. Хотелось бы узнать, как написать программку красиво и в чем моя ошибка.

Изначально основа кода взята отсюда 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;  //обратные вычисления после передачи (почемуто не работают в одной строке с удалением ключа)

я получил желаемый результат. По сути я лишь вынес удаление сервисных чисел в отдельные строки и все заработало. 

Засим вопрос - где моя ошибка? почему отрицательная температура отказывается нормально обратно считаться в одну строку?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Насколько я помню надо задать как-то так temp=((float)receivedCode-key2))/10;

Для влажности вычитание/прибавление 500 не нужно.

Это моя стататья ) Давненько уже писал. А чем вариант на attiny не устраивает ? дешевле и компактнее

pureac1d
Offline
Зарегистрирован: 23.01.2015

Да досталась пачка промини, мег и унок на халяву. Вот и пользую. За подсказку спасибо!