3 LCD-näyttö RS485-väylään
Etänäyttö edellisessä kirjoituksessa rakennetulle lämpömittarille.
Näiden kahden Arduino-laitteen RS485-moduulien välille tarvitaan pelkästään kaksi johdinta:
A-A ja B-B.
[vastaanota_rs_485.ino]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
const char omaId = 'M'; //Tämän laitteen tunnus huomaa että '' eikä "" !
const int lahetysPin = 2; //tässä pinnissä RS485-moduulin ohjaus rx/tx
LiquidCrystal_I2C lcd(0x27, 16, 2); //Määritellään 2-rivinen LCD-näyttö
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); //testataan että näyttö toimii ok
lcd.print("ABCDEFGHIJKLMNOP");
lcd.setCursor(0, 1);
lcd.print("0123456789012345");
Serial.begin(9600);
Serial.setTimeout(50);
pinMode(lahetysPin, OUTPUT);
digitalWrite(lahetysPin, LOW);
}
void loop() {
if (Serial.available()) { //Jos sarjaportissa on dataa luettavaksi
String saapuvaData = Serial.readString();
if (saapuvaData.length() >= 5) { //Jos RS485:ltä saapuva sisältää tarpeeksi pitkän datan
if (saapuvaData[1] == omaId) { //Jos viesti on kohdistettu tälle laitteelle
saapuvaData.trim(); //Rivinvaihtomerkki pois
tulostaLcd(saapuvaData);
}
}
}
}
void tulostaLcd(String naytolle) {
lcd.clear(); // Tyhjennetään näyttö (Parempi olisi vain tulostaa teksti ja sen jälkeen tyhjiä välilyöntejä, koska clear vilkuttaa näyttöä hieman)
naytolle = naytolle.substring(4); // Ensimmäinen lämpötila alkaa tästä kohdasta
while (naytolle.indexOf(";") > 0) { //Käydään saatua merkkijonoa niin kauan läpi, kun siinä on tulostamattomia lämpötiloja. Lämpötila päättyy aina ";" merkkiin
int loppu = naytolle.indexOf(";"); //Etsitään kohta, johon kyseinen lämpötila päättyy merkkijonossa
String lampo = naytolle.substring(0, loppu); //Tässä varsinainen lämpötila muodossa "1=25.12"
int anturiNumero = naytolle.substring(0,1).toInt();// 1=25.12 eka merkki kertoo mikä anturi on kyseessä.
naytolle = naytolle.substring(loppu + 1); //Poistetaan rivistä jo käsitelty osuus
if (anturiNumero == 0) lcd.setCursor(8, 0); //anturi 0 yläoikea
if (anturiNumero == 1) lcd.setCursor(0, 1); //anturi 1 ala vasen
if (anturiNumero == 2) lcd.setCursor(8, 1); //anturi 2 ala oikea
lcd.print(lampo.substring(2)); //Jätetään vielä anturinumero "1=" tulosteesta pois kun näytöllä ei ole tilaa..
anturiNumero++;
}
}



Kommentit
Lähetä kommentti