LCD arduino na tijd rare tekens

Beste Arduino gebruikers,

Ik heb voor mijn project een LCD scherm gebruikt van het type GDM2002D. Nu is mijn probleem dat deze perfect weergeeft wat ik vraag, namelijk temperatuur, datum, uur. Maar na zo'n 1 à 2 dagen of op sommige momenten zelfs sneller geeft mijn LCD scherm rare tekens weer op mijn LCD. ik zelf ben niet zo vertrouwd met het gebruiken van arduino en heb ondertussen al enkele dingen toegepast maar deze werken niet. Het enige wat nog overblijft is het LCD scherm vernieuwen. De code probeer ik hieronder te plaatsen ook. Bijlage is het scherm van de LCD na enkele tijd.

Hopelijk kan iemand mij hiermee helpen.

code:

c code:


#include <DS1302.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);

int RelaisKoel1 = 9;             // RelaisKoel is verbonden met pin 9 van de Arduino
int RelaisKoel2 = 10;
int temp_sensor_Koel = 5;       
int temp_sensor_Verw = 6;
const int Vakantieknop = 34;
int ContrastLCD = 40;
int LED = 30;
int LEDvakantie = 32;


float temperatureBinnen = 0;      
float temperatureBuiten = 0;
int lowerLimitBinnen = 19;      
int upperLimitBinnen = 21;      
int lowerLimitBuiten = 17;
int upperLimitBuiten = 25;
int Vakantiemodus = 0;
int VakantieRelais1 = 0;
int VakantieRelais2 = 0;

LiquidCrystal lcd(12,11,22,24,26,28);

OneWire oneWirePin1(temp_sensor_Koel);

OneWire oneWirePin2(temp_sensor_Verw);

DallasTemperature sensorsBinnen(&oneWirePin1);
DallasTemperature sensorsBuiten(&oneWirePin2);

void setup(void){

  {
  lcd.begin(20,2);
  }

  {
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  

  // The following lines can be commented out to use the values already stored in the DS1302
  //rtc.setDOW(TUESDAY);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(10,40 , 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(18, 6, 2019);   // Set the date to August 6th, 2010
}

  //Setup the Relais & LEDS to act as outputs
  pinMode(RelaisKoel1,OUTPUT);
  pinMode(RelaisKoel2,OUTPUT);
  pinMode(LED,OUTPUT);
  pinMode(LEDvakantie,OUTPUT);


  sensorsBinnen.begin();
  sensorsBuiten.begin();

  digitalWrite(RelaisKoel1, LOW);
  digitalWrite(RelaisKoel2, LOW);
  digitalWrite(LED, LOW);
  digitalWrite(LEDvakantie, LOW);

  pinMode(Vakantieknop, INPUT);
}

void loop(){

  Vakantiemodus = digitalRead(Vakantieknop);

  

 
if (Vakantiemodus == HIGH ) 

 {
  digitalWrite(LEDvakantie, LOW);
  sensorsBinnen.requestTemperatures(); 
  
  
  temperatureBinnen = sensorsBinnen.getTempCByIndex(0);

 
  sensorsBuiten.requestTemperatures(); 
  
  
  temperatureBuiten = sensorsBuiten.getTempCByIndex(0);
    
     // Send date
  lcd.setCursor(0,0);
  lcd.print(rtc.getDateStr());
  

  // Send time
  lcd.setCursor(12,0);
  lcd.print(rtc.getTimeStr());
  
  lcd.setCursor(11,1);
  lcd.print("T: ");
  lcd.print(temperatureBuiten);
  lcd.print("C");

  
 
  
  //Warmtepomp op stand verwarmen of koelen voor binnen temperatuur en kijken naar buiten temperatuur

 
  
  if(temperatureBinnen <= lowerLimitBinnen && temperatureBuiten <= lowerLimitBuiten){
    
    lcd.setCursor(0,1);
    lcd.print("Verwarmen  ");
    
    digitalWrite(RelaisKoel1, LOW);
    digitalWrite(RelaisKoel2, LOW);
    digitalWrite(LED, HIGH);
  }
   
  else if(temperatureBinnen >= upperLimitBinnen || temperatureBuiten >= upperLimitBuiten){

    lcd.setCursor(0,1);
    lcd.print("Koelen     ");
    
    
    digitalWrite(RelaisKoel1, HIGH);
    digitalWrite(RelaisKoel2, HIGH);
    digitalWrite(LED, LOW);
  }

  
 }

 else
  
 {
   // Send date
  lcd.setCursor(0,0);
  lcd.print(rtc.getDateStr());
  

  // Send time
  lcd.setCursor(12,0);
  lcd.print(rtc.getTimeStr());
  
  lcd.setCursor(0,1);
  lcd.print("Vakantiemodus :)    ");
  
  VakantieRelais1 = digitalRead(RelaisKoel1);
  VakantieRelais2 = digitalRead(RelaisKoel2);
  

  

  if( VakantieRelais1 == HIGH && VakantieRelais2 == HIGH ){  // vakantie koelen
    digitalWrite(RelaisKoel1, HIGH);
    digitalWrite(RelaisKoel2, HIGH);
    digitalWrite(LED, LOW);
    digitalWrite(LEDvakantie, HIGH);
  }
  
  else if( VakantieRelais1 == LOW && VakantieRelais2 == LOW) { // vakantie verwarmen
    digitalWrite(RelaisKoel1, LOW);
    digitalWrite(RelaisKoel2, LOW);
    digitalWrite(LED, HIGH);
    digitalWrite(LEDvakantie, HIGH);
  }
  
  }
  
  delay(1050);
}

Mvg

[Bericht gewijzigd door Henry S. op zondag 25 augustus 2019 17:47:47 (0%)

In het verleden is mij gebleken dat zo een setup gevoelig kan zijn voor sporadische (of niet zo sporadische) interferentie / glitches. Uptime inderdaad niet langer dan een paar dagen.

Die helemaal uit te sluiten is soms lastig, af en toe op een praktisch moment een herinitialisatie met lcd.begin() is niet elegant maar helpt even goed.

Sine

Moderator

Hoe lang is de kabel tussen de controller en het lcd?

Op 24 augustus 2019 10:55:30 schreef Aart:
In het verleden is mij gebleken dat zo een setup gevoelig kan zijn voor sporadische (of niet zo sporadische) interferentie / glitches. Uptime inderdaad niet langer dan een paar dagen.

Die helemaal uit te sluiten is soms lastig, af en toe op een praktisch moment een herinitialisatie met lcd.begin() is niet elegant maar helpt even goed.

Ik ben zelf een "groentje" bij het programmeren. kun je me anders helpen waar ik die herinitialisatie moet doen dan?

Op 24 augustus 2019 10:57:28 schreef Sine:
Hoe lang is de kabel tussen de controller en het lcd?

Die is zo'n 8 à 10 m

oei, dat is wel heel lang, genoeg om wat data corrupt te krijgen tussen controller en lcd.

ik weet niet of er mogelijkheden zijn om de buffer van een lcd op te vragen? maar je zou idd eens om de X tijd eens kunnen initialiseren.

wij hebben op het werk ook een arduino met 4x20 LCD hangen die de temperatuur van de serverroom weergeeft op het scherm, en dat werkt al jaren 24/24 goed.

ik hou van werken ..., ik kan er uren naar kijken
mel

Golden Member

Waarschijnlijk idd een watchdogtimer toepassen, die 1 keer per dag de boel reset.

u=ir betekent niet :U bent ingenieur..

Dat is extreem lang, ik ben geen ervaring voorbij 20cm.
In zo een geval zou ik een aparte 'Duino bij het LCD plaatsen en b.v. een trage seriële verbinding gebruiken om de data daar te krijgen.

De standaard Arduino LCD libraries zenden bij mijn weten alleen, teruglezen vanuit de registers van het display is niet geïmplementeert. Het spaart een pin :)

Plaats de code tussen [code ]-tags, dat leest veel prettiger. Zie de UBB-code uitleg. (Overigens geen garantie dat ik iets zinnigs kan bijdragen)

Op 24 augustus 2019 10:59:11 schreef LS-Tech:
[...]
Die is zo'n 8 à 10 m

Je bedoelt zeker 8..10 cm?

@mel: LELIJK!

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Arco

Special Member

Zo'n enorm eind kabel aan een parallel display heb ik nog nooit meegemaakt (en zou ik ook zeker nooit doen)
Wat je kunt proberen is alle aders die je over hebt als Gnd te gebruiken. (1 dunne ader is zeker niet genoeg)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Als TS écht 8 a 10m bedoelde, en niet cm, zou ik er eerder aan denken om de lange afstand seriëel te overbruggen (eventueel met differentiële signalen?), en dan een extra controller vlak bij het LCD te plaatsen die deze meteen aanstuurt met de informatie die het krijgt van het hoofdtoestel.

Op 24 augustus 2019 11:02:51 schreef fcapri:
oei, dat is wel heel lang, genoeg om wat data corrupt te krijgen tussen controller en lcd.

ik weet niet of er mogelijkheden zijn om de buffer van een lcd op te vragen? maar je zou idd eens om de X tijd eens kunnen initialiseren.

wij hebben op het werk ook een arduino met 4x20 LCD hangen die de temperatuur van de serverroom weergeeft op het scherm, en dat werkt al jaren 24/24 goed.

Idd bij ons staat de arduino in de technische ruimte en het LCD scherm hangt in de bedienden ruimte zodanig dat ze kunnen weten in welke modus het programma is geschakeld en hoe warm het is.

De vraag is nu hoe ik idd om de X aantal tijd mijn LCD initialiseer. Ik denk dat dit ook de oplossing zal zijn dan.

Op 24 augustus 2019 11:13:55 schreef Arco:
Zo'n enorm eind kabel aan een parallel display heb ik nog nooit meegemaakt (en zou ik ook zeker nooit doen)
Wat je kunt proberen is alle aders die je over hebt als Gnd te gebruiken. (1 dunne ader is zeker niet genoeg)

Er is geen mogelijkheid om de arduino dicht bij het LCD te plaatsen. Daarvoor dient de LCD zodanig dat ze visueel kunnen zien wat de arduino schakelt.

Arco

Special Member

Wat voor kabel gebruik je? (hopelijk wel iets fatsoenlijks als FTP of STP kabel...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 24 augustus 2019 12:24:15 schreef Arco:
Wat voor kabel gebruik je? (hopelijk wel iets fatsoenlijks als FTP of STP kabel...)

Ja we maken gebruik van een FTP kabel

Arco

Special Member

Afscherming en alle niet gebruikte aders dan als Gnd gebruiken...
Data traag verzenden kan helpen. Of afsluitweerstanden aan de kabel bij het display...

[Bericht gewijzigd door Arco op zaterdag 24 augustus 2019 12:33:20 (40%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 24 augustus 2019 12:31:21 schreef Arco:
Afscherming en alle niet gebruikte aders dan als Gnd gebruiken...
Data traag verzenden kan helpen. Of afsluitweerstanden aan de kabel bij het display...

Oke zal dit ook eens proberen dan.

Op 24 augustus 2019 11:08:56 schreef Aart:
Dat is extreem lang, ik ben geen ervaring voorbij 20cm.
In zo een geval zou ik een aparte 'Duino bij het LCD plaatsen en b.v. een trage seriële verbinding gebruiken om de data daar te krijgen.

De standaard Arduino LCD libraries zenden bij mijn weten alleen, teruglezen vanuit de registers van het display is niet geïmplementeert. Het spaart een pin :)

Plaats de code tussen [code ]-tags, dat leest veel prettiger. Zie de UBB-code uitleg. (Overigens geen garantie dat ik iets zinnigs kan bijdragen)

Ja het is idd lang maar LCD staat in de bureauruimte en arduino in de technische ruimte.

Is er geen mogelijkheid om bv. het LCD scherm om de 2 uur eens te " resetten ". Want wanneer ik de voeding van de installatie afneem en die dan opnieuw voeding geef werkt het LCD scherm perfect.

Arco

Special Member

Gewoon regelmatig de data opnieuw naar het display schrijven. (alle 20x2 karakters)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

probeer eens een LCD.begin() opnieuw te doen.
kijk eens of LCD.clear() ook niet werkt en schrijf je data desnoods elke 30sec opnieuw ipv karakters te gaan veranderen

de afstand is extreem. ik zou ook gewoon een nieuwe arduino (nano) bij je display zetten, en via dezelfde UTP kabel de boel voorzien van 5V.
tussen de 2 arduino verstuur je dan de data. de ene die de verwerkingen/handelingen doet, een 2de die gewoon het display voor zijn rekening neemt.

3de oplossing: hang er een I2C to parallel print tussen, gebruik ik altijd.
https://images-na.ssl-images-amazon.com/images/I/71wDJVbb5QL._SX425_.jpg
4draden naar dat printje, en dat printje zal zelf het scherm aansturen

ik hou van werken ..., ik kan er uren naar kijken
Arco

Special Member

hang er een I2C to parallel print tussen, gebruik ik altijd.

Da's bij 10 mtr kabel zonder extenders ook 'not done'...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

De mooiste oplossing vind ik een tweede Arduino dicht bij het LCD scherm, dan kun je de data met een checksum versturen tussen de twee Arduino's. Als de checksum fout is sla je het printen over.

Communicatie tussen de seriele poorten met een rs485 buffertje er tussen.

reading can seriously damage your ignorance
buckfast_beekeeper

Golden Member

WIFI geen mogelijkheid? ESP?

Anders een RS232 (TTL) display. VSS GND en RX. Heb je in een FTP nog genoeg 5 aders over. Een deftige condensator bij het LCD en 2400Bd moet haalbaar zijn.

edit: de standaard baudrate is 9600 maar kan met een commando naar beneden gebracht worden en opgeslagen in ROM. Baudrate loopt van 300Bd tot 115.2k.

Van Lambiek wordt goede geuze gemaakt.

Op 24 augustus 2019 12:40:50 schreef LS-Tech:
Ja het is idd lang maar LCD staat in de bureauruimte en arduino in de technische ruimte.

Dan is het nog steeds een heel bizarre oplossing om over zo'n enorm lange kabel te gaan. Dat moet je niet eens willen bedenken, of (nu je dat weet) het proberen werkend te krijgen. Het is bijna een wonder dat het uberhaupt werkt.
Snap je wat anderen zeggen, je moet niet de arduino verplaatsen, maar een extra Arduino erbij zetten die alleen het display aanstuurt. Je 1e Arduino stuurt dan niet meer het display aan, maar zend een bericht naar de 2e, die het dan naar het display schrijft. Een Nano kost maar een paar euro.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Arco

Special Member

Als er daar een desktop computer staat, stuur het dan daar naartoe. (Wifi of LAN)
Kan het hele display weg. (programmaatje op pc of via browser)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com