Messwerte zu einem Arduino mit LCD-Shield über I2C senden
Folgendes Problem war zu lösen:
Ein Arduino hatte kaum noch Pins frei, da jede Menge Tasten, Sensoren und Aktoren mit ihm verbunden waren.
Es war jedoch nötig, einige seiner Messwerte auf LCD auszugeben.
Lösung
Ein zweiter Arduino, der ein LCD-Shield trägt, empfängt die Messwerte über I2C
und gibt diese auf seinem LCD aus.
Die Widerstände R1 und R2 sind zwei 1,8KΩ-Widerstände
Quelltext für den Master:
/*
MASTER
der Master erzeugt 3 Zahlenwerte (von den Analogeingängen):
Temperatur: 0..255
Helligkeit: 0..255
Luftfeuchtigkeit: 0..255
... und sendet diese über I2C zu einem Slave mit der Adresse: 5
*/
#include <Wire.h>
int temperatur, helligkeit, luftfeuchte;
void setup(){
Wire.begin();
}
void loop(){
temperatur = analogRead(A0) / 4; //moegliche Werte: 0..255
helligkeit = analogRead(A1) / 4;
luftfeuchte = analogRead(A2) / 4;
// zuweisen
byte x[3]={temperatur, helligkeit, luftfeuchte};
// senden
Wire.beginTransmission(5); // zu I2C-Adresse: 5
Wire.write(x[0]); // temperatur
Wire.write(x[1]); // helligkeit
Wire.write(x[2]); // luftfeuchte
Wire.endTransmission();
delay(1000);
}
In der Schaltung sind die Analogeingänge A0, A1 und A2 nicht beschaltet.
In diesem Zustand empfangen sie Rauschen und Störungen.
Die sich daraus ergebenden Werte nach analogRead(...) bewegen sich im Bereich: 0..1023.
Wir dividieren die Werte der Analogeingänge durch die Zahl 4, um aus dem Wertebereich 0..1023
den neuen Wertebereich 0..255 zu machen.
Das tun wir, weil wir Bytes senden wollen.
Und ein Byte fasst bekanntlich maximal die Zahl 255.
Quelltext für den Slave:
/*
SLAVE
- der Slave trägt ein LCD Shield
- er empfängt drei Bytes vom Master
- diese gibt er auf dem LCD als Zahlenwerte aus
*/
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
void setup(){
lcd.begin(16, 2);
lcd.clear();
Wire.begin(5); // Adresse dieses Slaves: 5
Wire.onReceive(receiveEvent);
}
void loop(){
}
void receiveEvent(int howMany){
lcd.clear();
while (Wire.available())
{
int temperatur = Wire.read();
int helligkeit = Wire.read();
int luftfeuchte = Wire.read();
lcd.print(temperatur); lcd.print(" ");
lcd.print(helligkeit); lcd.print(" ");
lcd.print(luftfeuchte); lcd.print(" ");
}
}
|