Датчик температуры и передаче данных через VirtualWire

ustisha
Offline
Зарегистрирован: 30.05.2014

Добрый день. 

Есть такая проблема при отправке данных через 433Mhz передатчик по VirtualWire, если измерение температуры происходит сразу после передачи данных то показания температуры "скачат" на несолько градусов. Передаются верные данные но на подключенном экране это видно да и мешает другой логике. Не могу понять в чем причина этих скачков. Спасибо.

Send: |0|16807|1|258| Len: 15
Sensor read: 27.20
Sensor read: 25.80
Send: |0|3473|1|258| Len: 14
Sensor read: 27.20
Sensor read: 25.80
Send: |0|18143|1|258| Len: 15
Sensor read: 25.90
Sensor read: 25.90
Sensor read: 25.90
Send: |0|64435|1|259| Len: 15
Sensor read: 27.20
Sensor read: 25.90
Send: |0|38109|1|259| Len: 15
Sensor read: 27.20
Sensor read: 25.90
Send: |0|24803|1|259| Len: 15

Китайская Arduino Nano V3

Передатчик обычный 433Mhz

Датчик AM2302 

 

Код скетча

#include <VirtualWire.h>
#include <ZtLib.h>
#include <dht.h>
#include <Wire.h>

#define DLED 0x27
#define DHT22 4
#define ROUT 2

class Sensor {
private:
  dht sensor;
  byte pin;
  double humidity;
  double temperature;
public:
  Sensor(byte s) : pin(s) {

  }
  double getHumidity() {
    return humidity;
  }
  double getTemperature() {
    return temperature;
  }
  void tick() {
    int status;
    if (millis() % 2000 != 0) {
      return;
    }

    status = sensor.read22(pin);
    switch (status)
    {
    case DHTLIB_OK:  
      //Serial.print("OK,\t"); 
      break;
    case DHTLIB_ERROR_CHECKSUM: 
      //Serial.print("Checksum error,\t"); 
      break;
    case DHTLIB_ERROR_TIMEOUT: 
      //Serial.print("Time out error,\t"); 
      break;
    default: 
      //Serial.print("Unknown error,\t"); 
      break;
    }
    Serial.print("Sensor read: "); 
    Serial.println(sensor.temperature); 
    humidity = sensor.humidity;
    temperature = sensor.temperature;
  }
};

ZtLib led;

class TempController {

  const static byte CMD_TEMP = 1;
  const static byte CMD_HUM = 2;
  const static byte CMD_SET_TEMP = 3;
  const static byte CMD_R1 = 11;
  const static byte CMD_R2 = 12;

private: 
  Sensor *sensor1;
  byte sensorPin;
  byte radioOutPin;
public:
  TempController(byte pinSens, byte pinROut) : sensorPin(pinSens), radioOutPin(pinROut) {
    
    sensor1 = new Sensor(sensorPin);

    vw_setup(2000); 
    vw_set_tx_pin(radioOutPin);

  }
  void showTemperature() {
    led.Seg8b4a036aDisplayDec(DLED, sensor1->getTemperature() * 10, 3, 2);
  }
  void sendTemperature() {
    send(CMD_TEMP, sensor1->getTemperature() * 10);
  }
  void sendHumidity() {
    send(CMD_HUM, sensor1->getHumidity() * 10);
  }
  void send(byte cmd = 0, int d = 0, unsigned int dest = 0) {

    String strMsg = "|";
    strMsg += dest;
    strMsg += "|";
    strMsg += random(65535);
    strMsg += "|";
    strMsg += cmd;
    strMsg += "|";
    strMsg += d;
    strMsg += "|";

    char msg[255];

    strMsg.toCharArray(msg, 255);

    Serial.print("Send: ");
    Serial.print(msg);
    Serial.print(" Len: ");
    Serial.println(strlen(msg));

    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
  }
  void tick() {
    unsigned long m, s;
    m = millis();
    
    sensor1->tick();

    if ((m % 100) != 0) {
      return;
    } 

    showTemperature();

    if ((m % 5000) == 0) {
      sendTemperature();
    }
  }
};

TempController *ctrl;

void setup()
{
  Serial.begin(9600);

  led.I2cInit();
  led.Seg8b4a036aUnSleep(DLED);

  ctrl = new TempController(DHT22, ROUT);
}

void loop()
{
  ctrl->tick();
}

 

kleni00
Offline
Зарегистрирован: 25.08.2014

Удалось решить проблему? 

Собираюсь с метеостанции так же отправлять данные на серв. 

ustisha
Offline
Зарегистрирован: 30.05.2014

Проблемму не решил перешел на nRF24L01. Что странно не нашел что-бы такие проблемы у кого-то были.

kleni00
Offline
Зарегистрирован: 25.08.2014

Ясно, спасибо. Просто похожее решение собираю, но станция на ардуино будет передавать на 433 до Малины с приемником. Пока не знаю, какую библиотеку использовать, потому что виртуалвайр никто не портировал нормально на Малину, но похоже реально надо было сразу покупать другие трансиверы, эти на 433 какие-то туповатые :-( 

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

Малинка насколько я помню работает без проблем с RCswitch - его и используйте

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014