Messergebnis senden

Nachdem im letzten Schritt die Temperatur ausgelesen wurde, soll nun die Temperatur von einem Arduino zum anderen gesendet werden. Damit dies alles recht günstig passieren kann, habe ich hier wieder preislich entsprechende Teile gewählt. Die Kommunikation soll erstmal via 433MHz erfolgen (wie bei den billigen schaltbaren Steckdosen).

Hardware-Sendeeinheit

Identisch zum letzten Aufbau, zusätzlich wird noch ein RF Sender (3,49 €) benötigt.

Der Schaltplan wird jetzt um den RF Sender erweitert. Dieser braucht wie bereits der Temperatursensor, nur eine Leitung, neben der Stromversorgung.

Temperatur Sendeeinheit

 

Software-Sendeeinheit

Zu den bekannten Libraries benötigt man jetzt noch die Library VirtualWire.h. Das Programm wird nur um ein paar Zeilen erweitert. Die Serial Ausgabe fällt komplett weg, da die Daten jetzt per Funk ausgegeben werden sollen. Dafür wird im setup() der RF Sender initialisiert und mit Pin 3 verbunden. Für die Ausgabe wird die Temperatur in eine Zeichenkette umgewandelt, wofür die Methode Stoa verwendet wird – diese Methode habe ich via Google ermittelt, da gibt es einige Implementierungen.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <VirtualWire.h>

#define ONE_WIRE_BUS 2 // Digitaler Eingang

// Initalisieren
OneWire wire(ONE_WIRE_BUS); 
DallasTemperature sensor(&amp;wire); 

void setup() {
  delay(2000);
  
  sensor.begin();
  
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_tx_pin(3); 
  Serial.println("Temperaturen erfassen");
}

void loop() {
  sensor.requestTemperatures(); 
  
  char msg[10];
  float temp = sensor.getTempCByIndex(0);

  ftoa(msg, temp, 2);  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Wait until the whole message is gone
  delay(3000);
}    

char *ftoa(char *a, double f, int precision)
{
  long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
  char *ret = a;
  long heiltal = (long)f;
  
  itoa(heiltal, a, 10);
  while (*a != '\0') a++;
  *a++ = '.';
  long desimal = abs((long)((f - heiltal) * p[precision]));
  itoa(desimal, a, 10);
  return ret;
}

Hardware-Empfangseinheit

Auf der anderen Seite wird auch ein Arduino verwendet, dieser braucht aber nur ein RF Link Empfänger (4,37 €). Die Schaltung ist wieder relativ einfach, ein Beispiel findet man direkt beim Händler des Gerätes.

TempRecv_Steckplatine

 

Software-Empfangseinheit

Der Code der Empfangseinheit ist kürzer als bei der Sendeeinheit, da nur die Zahl aus der Message ausgelesen und ausgegeben werden muss. Wieder wird ähnlich wie beim Senden, der Baustein initialisiert, bevor in loop() immer geprüft wurde, ob die aktuelle Message ein entsprechende Nachricht enthält. Wenn es eine Nachricht gibt, wird der Text aus der Nachricht ausgelesen.

#include <OneWire.h>
#include <VirtualWire.h>

void setup()
{
    delay(1000);
    Serial.begin(9600);	// Debugging only

    delay(1000);
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec
    vw_set_rx_pin(3);
    vw_rx_start();       // Start the receiver PLL running
    Serial.println("Setup abgeschlossen");
}

void loop() 
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;


    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
	int i;
        char msg[10] = "         ";
	for (i = 0; i < buflen; i++)
	{
            msg[i] = buf[i];
	}
	Serial.println(msg);
   }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.