/* ********************************************************************************************************************************** // *** Name des Sketch : _433_Mhz_TX_sensor // *** Erstellungsdatum : 16.05.2016 // *** Entwickler : DL2EBZ, DL9VDV // *** Aufgabe des Sketch : drahtloser 433-Mhz-Aussendung von bis zu 15 unterschiedlichen Sensor-Daten // *** // *** Aenderungen/Erweiterungen : // *** // *** moegliche Erweiterungen : // *** // ********************************************************************************************************************************* */ /* Example for different sending methods http://code.google.com/p/rc-switch/ Das Programm baut auf der Idee von DL2EBZ auf, ist aber dann weiter auf dem Konzept der 'getrennten Sensor-Daten-Uebertragung' von DL9VDV weiterentwickelt worden. So werden zusaetzlich auch Kennungen fuer den einzelnen Sensor-Wert mitgesendet, als auch eine Kennung fuer das Vorzeichen. So koennen Negativ-Werte (z.B. Temperatur) übertragen werden, als auch bis zu 15 (16) unterschiedliche Sensor-Werte. */ #include RCSwitch mySwitch = RCSwitch(); int led = 13; #include // DHT-Bibliothek #define DHTPIN 9 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // #define DHTTYPE DHT21 // DHT 21 (AM2301) // #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); // Temp-Feuchte-Sensor float h; // Luftfeuchte DHT22 float t; // Temperatur DHT22 void setup() { Serial.begin(9600); pinMode(led, OUTPUT); // LED pinMode(6, OUTPUT); // Data pinMode(7, OUTPUT); // GND digitalWrite(7, LOW); // aktivieren pinMode(5, OUTPUT); // VCC 5V digitalWrite(5, HIGH);// aktivieren // Der datenausgang des Senders ist mit dem Arduino Pin #6 verbunden mySwitch.enableTransmit(6); dht.begin(); // Start des Temp-Sensors } // ende setup void loop() { // *** Sensorwerte einlesen *** h = (dht.readHumidity()); // Luftfeuchte auslesen, sowie mit einem Korrektur-Wert addieren t = dht.readTemperature(); // Temperatur auslesen float dht22_hygro = (h); // Luftfeuchte DHT22 float dht22_temp = (t); // Temperatur DHT22 sende_433_hygro(dht22_hygro); sende_433_temp_dht22(dht22_temp); delay(20000); // aktuell 20 Sekunden // Serial.println("20 Sekunden sind vorbei."); // ************************************************************************************************************************************** } void sende_433_hygro(float input) { int ident = 10; int nachkomma = 2; sende_433_float(input, ident, nachkomma); // z.B. 72,73102 --> 72,73% Luftfeuchte - ident= 10 - nachkommastellen = 2 // sende_433_float(input, ident, 10); } void sende_433_temp_dht22(float input) { int ident = 12; int nachkomma = 1; sende_433_float(input, ident, nachkomma); // z.B. 17,7121 --> 17,7°C Temperatur - ident= 12 - nachkommastellen = 1 // sende_433_float(input, ident, 10); } // *** Hier koennen weitere 13 Sensor-Werte nachgetragen werden *** // ****** --- 433 MHz Sende-Funktionen Beginn --- ********* // ******************************************************** void sende_433_int(int input, int ident) { long wert = input; sende_433_send(wert, ident, 0); } void sende_433_long(long input, int ident) { sende_433_send(input, ident, 0); } // nachkomma = Anzahl der Nachkommastellen; 0 fuer Integer; 1-9 float; 10 automatisch void sende_433_float(float input, int ident, int nachkomma) { long wert; float test; int lv_while = 0; int merk_nk = nachkomma; if (nachkomma > 10 || nachkomma < 0) return; if (nachkomma == 10) { nachkomma = 0; while (nachkomma < 9) { if (input >= 100000.0 || input <= -100000.0) break; wert = input; test = wert; if ((input - test) == 0.0) break; input = input * 10.0; nachkomma = nachkomma + 1; } } else { lv_while = nachkomma; while (lv_while > 0) { if (input >= 100000.0 || input <= -100000.0) break; input = input * 10.0; lv_while = lv_while - 1; } } wert = input; nachkomma = nachkomma - lv_while; // Workaround wegen Nachkommastellen; auf-/abrunden test = wert; if ((input - test) >= 0.5 && wert < 999999) wert = wert + 1; if ((input - test) <= -0.5 && wert > -999999) wert = wert - 1; // Korrektur, falls durch Addition der Nachkommastellen Nullen am Ende sind if (merk_nk == 10) { while (nachkomma > 0) { if (wert - ((wert / 10) * 10) != 0) break; wert = wert / 10; nachkomma = nachkomma - 1; } } sende_433_send(wert, ident, nachkomma); } /* Stellen 1234567890 Bedeutung mySwitch.send(4294967295, 32); Typ long max 10 Stellen 1-2: Code 10-40 in Zweierschritten - Identifikation des Wertes Zweierpaerchen: Code + 1 (ungerade) für negatives Vorzeichen 3: Anzahl der Nachkommastellen; 0-9 4-9: Wert 6 Stellen 10: Pruefcode Module 9 Stellen 1-9 */ void sende_433_send(long input, int ident, int nachkomma) { unsigned long wert; int minus = 0; int pruefcode; if (ident < 10 || ident > 40) return; if (ident % 2 != 0) return; if (nachkomma > 9 || nachkomma < 0) return; if (input < 0) minus = 1; input = abs(input); if (input > 999999) return; wert = ((ident + minus) * 10000000) + (nachkomma * 1000000) + input; pruefcode = wert % 9; wert = wert * 10 + pruefcode; mySwitch.send(wert, 32); Serial.println(wert); // nochmal senden wg. Kollision delay(50); mySwitch.send(wert, 32); } // --- 433 MHz Sende-Funktionen Ende