Da ich mir gerade ein Zusatzdisplay für meinen Elektroroller aufbaue, auf dem ich die Aussen, Akku und Motortemperatur ablesen kann, war ich auf der Suche nach einem geeigneten kleinen Display, das so kompakt ist, dass ich es in meine Lenkerverkleidung einbauen kann. Dabei bin ich auf das Nokia 5110 gestoßen. Dieses Display ist klein, leuchtstark und absolut flexibel was die Anzeige angeht. So kann man neben Text auch eigene Logos und Grafiken erstellen und anzeigen lassen.
Benötigte Bauteile
- 1 x Arduino (nano)
- 1 x Nokia 5110 LCD-Display
- 3 x DS18B20 Temperatursensoren
- 1 x Piezo (Tonausgabe)
- 1 x RGB LED
- 3 x Widerstand für die RGB LED
Verbinden aller Bauteile mit einem Arduino Nano
Pinbelegung des Nokia 5110
Achtung, da es mehrere Versionen dieses Displays gibt, sind diese Angaben ohne Gewähr.
Also bitte selbst in das passende Datenblatt des eigenen Displays schauen.
Beim verbinden der Pins des Nokia 5110 mit dem Arduino sollte man unbedingt darauf achten, dass die Hintergrundbeleuchtung nur mit 3,3V betrieben werden darf. Schließt man diese an 5V an kann das Display zerstört werden.
Obwohl im Datenblatt des PCD8544 Controllers VCC 3,3V empfohlen werden, kann das LCD-Display mit 3,3V wie auch mit 5V betrieben werden. An den Signalleitungen werden keine zusätzlichen Widerstände benötigt. Es werden 5 Pins für die Signalleitungen, 1 Pin für VCC mit 3,3 oder 5 V, 1 Pin mit 3,3 V für die LED-Hintergrundbeleuchtung, und 1 Pin mit die Masse (GND) benötigt.
1. LED = Hintergrundbeleuchtung (3,3V) 2. SCLK = serial clock input 3. DN (MOSI) 4. D/C = data/command 5. RST = external reset input 6. SCE = chip enable 7. GND = Pin Ground 8. VCC = +3,3V oder +5V
Sketch für den Arduino
#include <OneWire.h> #include <DallasTemperature.h> #include <LCD5110_Graph.h> const byte tempPin = 6; // digital Pin - DS1820 const byte buzzerPin = 5; // digital Pin - Buzzer //DS1820 Temperatur Sensor OneWire oneWire(tempPin); DallasTemperature sensors(&oneWire); DeviceAddress batterieThermometer, outsideThermometer, engineThermometer; //NOKIA 5110 Display LCD5110 lcd(8,9,10,11,12); // SCK, MOSI, DC, RST, CS extern unsigned char SmallFont[]; extern unsigned char BigNumbers[]; static int page = 0; char temperatureF[6]; long previousMillis = 0; long interval = 5000; void setup(void) { lcd.InitLCD(); sensors.begin(); pinMode(buzzerPin, OUTPUT); // Anzahl Sensoren auf dem Display ausgeben lcd.clrScr(); lcd.setFont(SmallFont); lcd.print(F("Sensoren"), CENTER, 0); lcd.setFont(BigNumbers); lcd.print(String(sensors.getDeviceCount(), DEC), CENTER, 16); lcd.update(); delay(1000); if (!sensors.getAddress(outsideThermometer, 0)) { lcd.setFont(SmallFont); lcd.clrScr(); lcd.print(F("Aussen"), CENTER, 5); lcd.print(F("Temperatur"), CENTER, 15); lcd.print(F("Sensor"), CENTER, 25); lcd.print(F("fehlt!"), CENTER, 35); lcd.update(); playTone(2); delay(2000); } if (!sensors.getAddress(batterieThermometer, 1)) { lcd.setFont(SmallFont); lcd.clrScr(); lcd.print(F("Batterie"), CENTER, 5); lcd.print(F("Temperatur"), CENTER, 15); lcd.print(F("Sensor"), CENTER, 25); lcd.print(F("fehlt!"), CENTER, 35); lcd.update(); playTone(2); delay(2000); } if (!sensors.getAddress(engineThermometer, 2)) { lcd.setFont(SmallFont); lcd.clrScr(); lcd.print(F("Motor"), CENTER, 5); lcd.print(F("Temperatur"), CENTER, 15); lcd.print(F("Sensor"), CENTER, 25); lcd.print(F("fehlt"), CENTER, 35); lcd.update(); playTone(2); delay(2000); } // Intro lcd.clrScr(); lcd.setFont(SmallFont); lcd.print(F("GUTE FAHRT"), CENTER, 18); lcd.update(); delay(2000); } void loop(void) { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if(page == 2) page = 0; else page++; } switch (page) { case 0: if (sensors.getAddress(outsideThermometer, 0)) { printTemperature(outsideThermometer); } else page++; break; case 1: if (sensors.getAddress(batterieThermometer, 1)) { printTemperature(batterieThermometer); } else page++; break; case 2: if (sensors.getAddress(engineThermometer, 2)) { printTemperature(engineThermometer); } else page = 0; break; default: if (sensors.getAddress(outsideThermometer, 0)) { printTemperature(outsideThermometer); } } } void convertToString(float number) { dtostrf(number, 3, 1, temperatureF); } void printTemperature(DeviceAddress deviceAddress) { sensors.requestTemperatures(); float tempC = sensors.getTempC(deviceAddress); convertToString(tempC); lcd.clrScr(); lcd.setFont(SmallFont); //Je nach Sensor andere Bezeichnung und Grafik auf Display anzeigen if(deviceAddress == outsideThermometer) { lcd.print(F("Aussen"), CENTER, 0); } else if(deviceAddress == batterieThermometer) { lcd.print(F("Batterie"), CENTER, 0); } else if(deviceAddress == engineThermometer) { lcd.print(F("Motor"), CENTER, 0); } lcd.drawLine(0, 8, 84, 8); //Temperatur auf Display ausgeben lcd.setFont(BigNumbers); lcd.print(temperatureF,CENTER,16); lcd.update(); } void playTone(byte amount) { for(int i=0; i<amount; i++) { tone(buzzerPin, 1000, 150); delay(200); tone(buzzerPin, 1500, 150); delay(200); } }