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(" ");
		}
	}