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.
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
#include
#include
#define ONE_WIRE_BUS 2 // Digitaler Eingang
// Initalisieren
OneWire wire(ONE_WIRE_BUS);
DallasTemperature sensor(&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.
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
#include
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