de tijd van rtc op juiste plaats op lcd plaatsen

Arduino specifieke Software
Berichten: 12
Geregistreerd: 25 Aug 2016, 17:21

de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor adval40 » 30 Aug 2016, 23:27

Ik ben sind een week aan het programmeren op een arduino
ik krijg de minuten/sec niet goed op scherm

Code: Alles selecteren
  lcd.setCursor(0, 0);
  lcd.print(uur,DEC);
  lcd.print(':');
  lcd.print(minuut,DEC);
  lcd.print(':');
  lcd.print(seconde,DEC); 



nu komt er 23:1:4 te staan in plaats van 23:01:04

gr Ad

ik heb inmiddels een oplossing gevonden
Code: Alles selecteren
lcd.setCursor(0, 0);
  if (uur <10)
  {
    lcd.print('0'); 
  }
  lcd.print(uur,DEC);
  lcd.print(':');
  if (minuut <10)
  {
    lcd.print('0'); 
  }
  lcd.print(minuut,DEC);
  lcd.print(':');
  if (seconde <10)
  {
    lcd.print('0'); 
  }
  lcd.print(seconde,DEC);   


ik hoopte dat er een kortere manier was
onder proton picbasic deed je print dec2 seconde


ik heb dit weekend dit forum pas gevonden en ik vind het zeer leerzaam

Groeten uit Eindhoven

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor Koepel » 31 Aug 2016, 02:01

Dat is een goede oplossing. Ik doe het vaak op die manier.

Een andere manier is met sprintf. Dan is er wel een extra buffer nodig.
Ik doe dit uit mijn hoofd, dus ik weet niet zeker of het klopt :?
Code: Alles selecteren
  char buffer[20];
  sprintf( buffer, "%02d:%02d:%02d", uur, minuut, seconde);

  lcd.setCursor( 0, 0);
  lcd.print( buffer);

Berichten: 12
Geregistreerd: 25 Aug 2016, 17:21

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor adval40 » 31 Aug 2016, 12:15

Het resultaat na 2 avondjes oefenen en veel lezen/zoeken .

Code: Alles selecteren
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;

byte jaar, maand, dag, dagnr, uur, minuut, seconde,temperatuur;
String dagnaam;
String maandnaam;

void setup() {
  // Start the I2C interface
  Wire.begin();
  lcd.begin(20, 4);
  lcd.clear();
 
  //        Clock.setSecond(0);  //Set the second
  //        Clock.setMinute(42); //Set the minute
  //        Clock.setHour(19);   //Set the hour
  //        Clock.setDoW(3);     //Set the day of the week
  //        Clock.setDate(30);   //Set the date of the month
  //        Clock.setMonth(8);   //Set the month of the year
  //        Clock.setYear(16);   //Set the year (Last two digits of the year)
  // Start the serial interface
   Serial.begin(115200);
}
void ReadDS3231()
{
  seconde=Clock.getSecond();
  minuut=Clock.getMinute();
  uur=Clock.getHour(h12, PM);
  dag=Clock.getDate();
  maand=Clock.getMonth(Century);
  jaar=Clock.getYear();
  dagnr=Clock.getDoW();
  temperatuur=Clock.getTemperature();
 
  if (dagnr == 1)  {
    dagnaam ="Maandag";
  }
  if (dagnr == 2)  {
    dagnaam ="Dinsdag";
  }
  if (dagnr == 3)  {
    dagnaam ="Woensdag";
  }
  if (dagnr == 4)  {
    dagnaam ="Donderdag";
  }
  if (dagnr == 5)  {
    dagnaam ="Vrijdag";
  }
  if (dagnr == 6)  {
    dagnaam ="Zaterdag";
  }
  if (dagnr == 7)  {
    dagnaam ="Zondag";
  }

  if (maand == 1)  {
    maandnaam ="Januari";
  }
  if (maand == 2)  {
    maandnaam ="Februari";
  }
  if (maand == 3)  {
    maandnaam ="Maart";
  }
  if (maand == 4)  {
    maandnaam ="April";
  }
  if (maand == 5)  {
    maandnaam ="Mei";
  }
  if (maand == 6)  {
    maandnaam ="Juni";
  } 
  if (maand == 7)  {
    maandnaam ="Juli";
  }
  if (maand == 8)  {
    maandnaam ="Augustus";
  }
  if (maand == 9)  {
    maandnaam ="September";
  }
  if (maand == 10)  {
    maandnaam ="Oktober";
  }
  if (maand == 11)  {
    maandnaam ="November";
  }
  if (maand == 12)  {
    maandnaam ="December";
  }
}
void loop() {ReadDS3231();delay(1000);

  lcd.setCursor(0,0);
  lcd.print(dagnaam);
 
  lcd.setCursor(0,1);
  if (dag <10)  {
    lcd.print('0'); 
  }
  lcd.print(dag,DEC);
  lcd.print(' ');
  lcd.print(maandnaam);
  lcd.print(' ');
  if (jaar <10)  {
    lcd.print('0'); 
  }
  lcd.print("20");
  lcd.print(jaar,DEC);
   
  lcd.setCursor(12,0);
  if (uur <10)  {
    lcd.print('0'); 
  }
  lcd.print(uur,DEC);
  lcd.print(':');
  if (minuut <10)  {
    lcd.print('0'); 
  }
  lcd.print(minuut,DEC);
  lcd.print(':');
  if (seconde <10)  {
    lcd.print('0'); 
  }
  lcd.print(seconde,DEC); 
   
  lcd.setCursor(0,3); 
  lcd.print("Temperatuur = ");
  lcd.print(temperatuur);
 // lcd.print((char)224);
  lcd.print(" C ");
}


Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor Koepel » 31 Aug 2016, 13:38

Een mooi resultaat :D

Ik weet niet welke library je gebruikt voor DS3231, dus ik weet ook niet of de temperatuur als een byte altijd goed gaat.
Deze zou het kunnen zijn : https://github.com/NorthernWidget/DS3231
Mijn eerste indruk is dat het goede code is. Als ik het vluchtig lees, dan springt er niets uit. Misschien kan er wat geoptimaliseerd worden voor de I2C. In die code is de temperatuur trouwens een 'float'.

In de taal 'c' en 'c++' worden reeksen van tekst vaak in een array gezet. In de Arduino kun je dat array ook als PROGMEM zetten, maar dat is iets voor later :geek:

Weet je zeker dat de dag-van-de-week bij maandag begint met getal '1' ? Ik zou verwachten dat het begint bij getal '0'.
In de taal 'c' en 'c++' begint een array met index '0'. Dus de index wordt dan "dagnr - 1".

De variabele 'dagnaam' zou kunnen vervallen. Je kunt meteen een tekst uit het array pakken met de index, zoals hieronder staat.

Een array van tekst kan dit zijn:
Code: Alles selecteren
char daysofweek[] = { "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag" };
char months[] = { "Januari", "Februari", "Maart" ... (zelf invullen)

// maandag is '1', en de index begint bij nul.
lcd.print(daysofweek[dagnr-1]);


Als dit allemaal logisch klink, dan kun je het op die manier proberen. Anders laat het je gewoon zo.

Berichten: 12
Geregistreerd: 25 Aug 2016, 17:21

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor adval40 » 31 Aug 2016, 21:54

Code: Alles selecteren
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

char daysofweek[] = { 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag' };



ik heb de dagen met single Quote moeten doen anders kreeg ik een foutmelding

Code: Alles selecteren
 
lcd.setCursor(0,0);
//  lcd.print(dagnr);
  lcd.print(daysofweek[dagnr]);


hier krijg ik een g op het scherm

dagnr = 3 (Woensdag)


Ad

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor Koepel » 31 Aug 2016, 22:20

Oeps :oops: mijn fout. Sorry.
Het is een array van pointers, elke pointer wijst naar een tekst.

Dit heb ik wel getest 8-) Er wordt een willekeurige dag van de week afgedrukt.
Code: Alles selecteren
char *daysofweek[] = { "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag" };

void setup()
{
  Serial.begin(9600);
  Serial.println( "\nStarted");
}
 
void loop()
{
  int i = random( 7);   // return a random number from 0 up to 6.
  Serial.println( daysofweek[i]);

  delay(1000);
}

Berichten: 12
Geregistreerd: 25 Aug 2016, 17:21

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor adval40 » 31 Aug 2016, 22:35

het werkt nu

ik pas het nu even aan en zal uiteindelijke sketch hier plaatsen

bedankt voor de hulp

Berichten: 12
Geregistreerd: 25 Aug 2016, 17:21

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor adval40 » 31 Aug 2016, 23:01

Code: Alles selecteren

#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

char *daysofweek[] = {"Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag","Zaterdag","Zondag"};
char *months[]  = "Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"};
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;

byte jaar, maand, dag, dagnr, uur, minuut, seconde ;
float temperatuur ;

void setup() {
  // Start the I2C interface
  Wire.begin();
  lcd.begin(20, 4);
  lcd.clear();
 
  //        Clock.setSecond(0);  //Set the second
  //        Clock.setMinute(42); //Set the minute
  //        Clock.setHour(19);   //Set the hour
  //        Clock.setDoW(3);     //Set the day of the week
  //        Clock.setDate(30);   //Set the date of the month
  //        Clock.setMonth(8);   //Set the month of the year
  //        Clock.setYear(16);   //Set the year (Last two digits of the year)
 
}
void ReadDS3231()
{
  seconde=Clock.getSecond();
  minuut=Clock.getMinute();
  uur=Clock.getHour(h12, PM);
  dag=Clock.getDate();
  maand=Clock.getMonth(Century);
  jaar=Clock.getYear();
  dagnr=Clock.getDoW();
  temperatuur=Clock.getTemperature();

}
void loop() {ReadDS3231();delay(1000);
  lcd.setCursor(0,0);
  lcd.print(daysofweek[dagnr-1]);
  lcd.setCursor(0,1);
  if (dag <10) 
  {
    lcd.print('0'); 
  }
  lcd.print(dag,DEC);
  lcd.print(' ');
  lcd.print(months[maand-1]);
  lcd.print(' ');
  lcd.print("20");
  if (jaar <10) 
  {
    lcd.print('0'); 
  }
  lcd.print(jaar,DEC);
  lcd.setCursor(12,0);
  if (uur <10)  {
      lcd.print('0'); 
  }
  lcd.print(uur,DEC);
  lcd.print(':');
  if (minuut <10) 
  {
    lcd.print('0'); 
  }
  lcd.print(minuut,DEC);
  lcd.print(':');
  if (seconde <10) 
  {
    lcd.print('0'); 
  }
  lcd.print(seconde,DEC); 
   
  lcd.setCursor(0,3); 
  lcd.print("Temperatuur ");
  lcd.print(temperatuur);
 // lcd.print((char)223);
  lcd.print(" C ");
}



de file is een stuk korter geworden ook de temperature is omgezet in float
het graden teken char(223) werkt op mijn lcd scherm 2004 niet.
verkeerde characterset denk ik daarom staat die uncomment

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: de tijd van rtc op juiste plaats op lcd plaatsen

Berichtdoor Koepel » 01 Sep 2016, 06:01

Kun je zelf een karakter maken voor het display ?

Ik bekeek nog even de datasheet van de DS3231, en alles begin bij nul, alleen de maand en de dag-van-de-week beginnen bij '1'. Dus dat klopt.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: igosefaeukuma, ovohihifez en 84 gasten