Data naar ser. monitor werkt maar niet naar LCD

Goeie middag vrienden,

Intussen ben ik wat gevorderd in mijn Arduino-"studies". Momenteel heb ik een RTC (DS3231) aangesloten en kan ik de datum + uur printen naar de seriële monitor. MAAR : toen heb ik een standaard LCD (2 x 16) aangesloten via de 4 data-lijnen (dus de gewone verbinding - geen I2C).
Ik dacht : laat ik Arduino de data van de RTC (voorlopig de temperatuur) eens sturen naar de LCD, maar dit lukt niet. Ik krijg enkele Chinese tekens rechts onderaan op de LCD.

Ik weet echt niet wat ik fout doe en info daarover vind ik niet direct. Ik denk : als Arduino de data correct naar de Seriële Monitor kan sturen, dan zou Arduino dit toch ook moeten doen naar de LCD.

Heeft iemand een ideetje wat ik verkeerd doe ?

Dit is mijn code bij mijn Arduino Leonardo waarvan de schets komt van RTC_DS3231 :

c code:


// Date and time functions using a DS3231 RTC connected via I2C and Wire lib

#include <LiquidCrystal.h>               //load lib Liquid Crystal

LiquidCrystal LCD (10, 9, 5, 4, 3, 2);   //define the 6 pins of the LCD

#include "RTClib.h"
RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"};

void setup () {
  Serial.begin(9600);

  LCD.begin (16, 2);    //config the LCD as 16 row/2 colom

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

void loop () {

  DateTime now = rtc.now();

  Serial.print(now.day(), DEC);     //print nr day
  Serial.print('/');                //print "/"
  Serial.print(now.month(), DEC);   //print nr month
  Serial.print('/');                //print "/"
  Serial.print(now.year(), DEC);    //print nr year
  Serial.print(" - ");              //print " - "
  //Serial.print(" (");
  //Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  //Serial.print(") ");
  Serial.print(now.hour(), DEC);    //print hour
  Serial.print(':');                //print ":"
  Serial.print(now.minute(), DEC);  //print minute
  Serial.print(':');                //print ":"
  Serial.print(now.second(), DEC);  //print second
  Serial.println();                 //new line

  Serial.print("Temperature: ");       //print "txt"
  Serial.print(rtc.getTemperature());  //print - temperature -
  Serial.println(" C");                //print "txt"

  Serial.println();                    //print new line

  delay (500);

  LCD.clear();
  LCD.setCursor (0, 0);             //set cursor on colom zero and row zero

  LCD.print("Temp: ");              //transmit "txt" to LCD
  LCD.print(rtc.getTemperature());  //transmit -temperature- to LCD
  LCD.println(" C");                //transmit "txt" to LCD + new line

  delay(500);
}

[Bericht gewijzigd door Henry S. op 2 mei 2022 21:13:27 (0%)

mel

Golden Member

Zijn de pinnen wel juist gedeclareerd?Geen pinnen verwisseld?

u=ir betekent niet :U bent ingenieur..

Goeie middag Aart en Mel,
Ja hoor, de LCD die ik aangesloten heb, was al aangesloten aan de Arduino met een Ultrasoon sensor HC-SR04 en dit werkte perfect. Ik heb enkel de US sensor vervangen door de RTC.

Ik zie ook dat ik mijn code op een niet correcte manier gekopieerd heb in dit topic.

Jan.

buckfast_beekeeper

Golden Member

Een breadbordje is vaak tricky. Niet altijd zijn de contacten even goed. Draadjes eens uittrekken en terug steken kan al eens helpen. Bij de LCD matrix schermen vind ik de RS232 versies toch net wat handiger. Je hebt dan ook maar 3 aansluitingen nodig.

Van Lambiek wordt goede geuze gemaakt.

Je hebt 3 control-lijnen aangesloten op het breadboard (RS/RW/E), en maar 2 daarvan staan in de configuratie bij LiquidCrystal.

Dat is verdacht, maar hoeft niet fout te zijn. Maar RW moet wel laag zijn als je die in de software niet gebruikt.

Goeie middag,
@buckfast_beekeeper : de LCD werkte goed met de US sensor. Ik heb zopas alle draadjes los- en terug gestoken - zelfde resultaat.

@deKees : ja hoor, RS=gele draad naar pin 10 Arduino / RW= witte draag naar massa (rood en wit gebruik ik steeds voor massa en V+) / E=groene draad naar pin 9 Arduino.

Zou het kunnen dat er ergens in Arduino één of ander register deze Chinese tekens doorstuurt ipv de data ?

Dank voor de reacties,
Jan.

KGE

Golden Member

Eerst weer even een example aan de praat helpen en dan verder zoeken.

Dag vrienden,

Eerst een kleine mededeling: ik heb de RTC losgekoppeld en uit de Arduino-voorbeelden (LiquidCrystal --> Hello World) geprobeerd. Dit werkt perfect.

Dan heb ik het andere voorbeeld (LiquidCrystal--> SerialDisplay) geprobeerd en krijg ik de tekst vanuit de seriële monitor op het LCD, maar steeds gevolgd door een Chinees teken. Als ik een lege inhoud verstuur vanuit de seriële monitor, krijg ik ook het Chinese teken (als enige teken) op het display.

Alle verbindingen zijn goed, de LCD lijkt mij goed te zijn,... Bizar.

Jan.

KGE

Golden Member

Je drukt op Enter aan het eind van de regel in je seriele monitor? Dan krijg je een ASCII 10 of 13 mee en dat is een vreemd teken op je LCD

Als ik het mij goed herinner zit je dan in de 'user defined characters' (de eerste 16 tekens, eigenlijk de eerste 8 maar de volgende 8 zijn hetzelfde)

[Bericht gewijzigd door KGE op 30 april 2022 20:20:02 (36%)

KGE

Golden Member

dit is de karakterset

De eerste 16 zijn dus de (2x) 8 user definable characters.
Heb je die niet gevuld staan er meestal random bits in.

Goeie avond KGE,
Dank voor de info.
Bij de tweede schets (de LiquidCrystal--> SerialDisplay) druk ik op "Verzenden". IK heb "Enter" geprobeerd en zowel bij Verzenden als bij Enter verschijnt het Chinese teken.
Dit teken vind ik ook niet terug in de karakterset. Ik vind de karakters op de LCD van mijn RTC-schets (vanop de foto die ik eerst heb gestuurd vandaag om 16:05:59) dan wel weer terug in de karakterset :

(high) - (low)
- 1101-1100
- 1110-1101
- 1110-1101
- 1111-1100

Als ik de schets - de SerialDisplay - inlaad in Arduino, dan is de LCD volledig clean. Pas als ik een tekst of zelfs een lege inhoud via de seriële monitor verstuur, verschijnt het teken.

Bij de andere schets - de HelloWorld - loopt alles perfect.

En bij mijn RTC-schets lees ik de data van de RTC op de seriële monitor perfect, maar niet op de LCD. Daar zijn dan die 4 karakters te zien.

Dus ik vermoed niet dat er een bedradingsfout is, maar ik moet ergens een foutje gemaakt hebben of misschien zit er wat data in één of ander register ???
Nogmaals : bizar en hoogst eigenaardig...

Jan

buckfast_beekeeper

Golden Member

Wijzig

c code:

LCD.print(rtc.getTemperature());

eens door

c code:

LCD.print((String)rtc.getTemperature());

Kent de LCD librarie een println()? Een println wordt normaal ook afgesloten met een ASCII 13 of CR (carriage return). Is hetzelfde als een enter.

[Bericht gewijzigd door buckfast_beekeeper op 30 april 2022 22:03:57 (26%)

Van Lambiek wordt goede geuze gemaakt.

Goeie avond,

Beste buckfast_beekeeper. Dank voor je info. Heb ik geprobeerd - echter zonder resultaat.

Ik bemerk dat jullie programma's of delen ervan in een blauw veldje plaatsen. Mag ik je beleefd vragen hoe ik dit moet doen ?
Dank
Jan.

Henry S.

Moderator

Om code correct/leesbaar te kunnen posten zijn er code-tags beschikbaar: https://www.circuitsonline.net/forum/faq/2#code_tag
Arduino staat er niet in als optie, maar c voldoet.

Ik heb je code in de startpost ook code-tags gegeven.

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.
buckfast_beekeeper

Golden Member

Maak er eens eerst een string van

c code:

String test = (String)rtc.getTemperature();
LCD.print(test);

Je kan dezelfde string dan ook naar je seriële poort sturen.

Van Lambiek wordt goede geuze gemaakt.

Probeer eens ipv

c code:

LCD.print(rtc.getTemperature());

c code:


LCD.write(rtc.getTemperature());
KGE

Golden Member

Op 30 april 2022 21:52:32 schreef Christine:
Bij de tweede schets (de LiquidCrystal--> SerialDisplay) druk ik op "Verzenden". IK heb "Enter" geprobeerd en zowel bij Verzenden als bij Enter verschijnt het Chinese teken.

Ja, verzenden geeft een 'Enter' (10 of 13) mee met de ingetypte tekst in de Arduino seriële monitor.

Dit teken vind ik ook niet terug in de karakterset.

Klopt, het is één van de tekens die je zelf kunt definieren in de LCD (codes 0 tot 15)

Ik vind de karakters op de LCD van mijn RTC-schets (vanop de foto die ik eerst heb gestuurd vandaag om 16:05:59) dan wel weer terug in de karakterset :

Daaruit blijkt dat LCD.print blijkbaar niet de juiste tekens stuurt. Ik vermoed dat het mis gaat bij de regel

code:

LCD.print(rtc.getTemperature()); 

Wanneer je die regel weg laat verschijnt er dan wel 'TempC' op het display ?

Probeer in kleine stappen te ontdekken waar het mis gaat.