Датчик температуры и передаче данных через VirtualWire
- Войдите на сайт для отправки комментариев
Пт, 30/05/2014 - 11:08
Добрый день.
Есть такая проблема при отправке данных через 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(); }
Удалось решить проблему?
Собираюсь с метеостанции так же отправлять данные на серв.
Проблемму не решил перешел на nRF24L01. Что странно не нашел что-бы такие проблемы у кого-то были.
Ясно, спасибо. Просто похожее решение собираю, но станция на ардуино будет передавать на 433 до Малины с приемником. Пока не знаю, какую библиотеку использовать, потому что виртуалвайр никто не портировал нормально на Малину, но похоже реально надо было сразу покупать другие трансиверы, эти на 433 какие-то туповатые :-(
Малинка насколько я помню работает без проблем с RCswitch - его и используйте
А вот на тиньках неплохое решение.