tijdschakelaar

Arduino specifieke Software
Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 30 Okt 2016, 10:33

het 16x 2 display was ik ook op terug gevallen, ik dacht op display:


A:W xxDay 00:00
B:L xxDay 00:00

Op een 16x4 (heb ik hier ook liggen) zou het meer uitgebreid kunnen

info is:

welke accu : laden (L) of wachten (W) aantal dagen uren en minuten.

ik heb namen en seconden weggelaten ivm de ruimte op display

ga vandaag naar mijn andere hobby Techniek en stoomdag wijchen met de kleinkinderen , worden deze misschien ook door techniek virus aangestoken

Groet Wim

Advertisement

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

Re: tijdschakelaar

Berichtdoor Koepel » 31 Okt 2016, 01:59

Er zijn twee manieren:
1 ) Zet het scherm op in setup() en schrijf alleen de getallen.
2 ) Bij iedere update het hele scherm opnieuw schrijven.

Bij optie 2 is de code vele malen korter als ik ook nog sprintf() gebruik.

Ik kies nu voor optie 1.
Op dit moment heb ik geen normale LCD met een Arduino verbonden, dus het is voor mij droogzwemmen.
In setup() :
Code: Alles selecteren
  // -------------------------------------
  // Initialize the LCD and setup the text
  // -------------------------------------
  // Setup the LCD according this:
  //
  //    0123456789012345
  //   +----------------
  // 0 |A:W xxDay hh:mm
  // 1 |B:L xxDay hh:mm
  //
  lcd.begin( 16, 2);
  lcd.print(F( "Opladen accus"));
  delay( 1500);
  lcd.clear();

  lcd.setCursor( 0,0);
  lcd.print(F( "A:- --Day --:-- "));
  lcd.setCursor( 0,1);
  lcd.print(F( "B:- --Day --:-- "));


En de functie "ShowEverything()" zou bijvoorbeeld "StatusToSerial()" kunnen gaan heten. Daar wil ik een tweede functie naast, bijvoorbeeld "StatusToLCD()" of "UpdateLCD()".
Dat geeft de mogelijkheid om het LCD iedere seconde te wijzigen, en de serial monitor maar eens in de 5 seconden.

Op dit moment kopieer ik de code die het aantal seconden opbreekt in dagen, uren, minuten en seconden.
Code: Alles selecteren
void UpdateLCD()
{
  for( i=0; i<2; i++)
  {
    // When 'i' is zero, it will be the first battery  "A".
    // When 'i' is one,  it will be the second battery "B".

    // print battery status. L = laden, W = wachten
    lcd.setCursor( 2, i);                    // row, column
    if( battery_state[i] == WAIT)
      lcd.print(F( "W"));
    else if( battery_state[i] == CHARGE)
      lcd.print(F( "L"));
    else
      lcd.print(F( "E"));     // E = Error.

    // Show the counter in days,hh:mm:ss
    int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
    int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
    int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
    int seconds = (int) (battery_count[i] % 60UL);

    // print days
    lcd.setCursor( 4, i);
    if( days < 10)
      lcd.print(F( " "));
    lcd.print( days);

    // print hours
    lcd.setCursor( 10, i);
    if( hours < 10)
      lcd.print(F( "0"));
    lcd.print( hours);

    // print minutes
    lcd.setCursor( 13, i);
    if( minutes < 10);
      lcd.print(F( "0"));
    lcd.print( minutes);
  }
}


Met sprintf() zou een hele regel gemaakt kunnen worden.
Code: Alles selecteren
    char *pBattery = (i == 0 ? "A" : "B");
    char *pStatus  = (battery_state[i] == WAIT ? "W" : "L");
    sprintf( buffer, "%1s:%1s %2dDay %02d:%02d, pBattery, pStatus, days, hours, minutes, seconds);


Als je de "Day" afkort tot "D", dan kunnen de seconden er wel bij.

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 31 Okt 2016, 21:05

Hallo Koepel,

eea geprobeerd,

de code
Code: Alles selecteren
cpp code
void UpdateLCD()
{
for( i=0; i<2; i++)
{
// When 'i' is zero, it will be the first battery "A".
// When 'i' is one, it will be the second battery "B".

// print battery status. L = laden, W = wachten
lcd.setCursor( 2, i); // row, column
if( battery_state[i] == WAIT)
lcd.print(F( "W"));
else if( battery_state[i] == CHARGE)
lcd.print(F( "L"));
else
lcd.print(F( "E")); // E = Error.

// Show the counter in days,hh:mm:ss
int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
int seconds = (int) (battery_count[i] % 60UL);

// print days
lcd.setCursor( 4, i);
if( days < 10)
lcd.print(F( " "));
lcd.print( days);

// print hours
lcd.setCursor( 10, i);
if( hours < 10)
lcd.print(F( "0"));
lcd.print( hours);

// print minutes
lcd.setCursor( 13, i);
if( minutes < 10);
lcd.print(F( "0"));
lcd.print( minutes);
}
}

werkt, Maar ik vraag me wel af waarom : if( minutes < 10) en lcd.print(F( "0")); erin zit??
Maar met hier en daar wat aanpassingen van mijn kan ; en evt sec toevoegen krijg ik deze wel goed.

maar de
cpp code
char *pBattery = (i == 0 ? "A" : "B");
char *pStatus = (battery_state[i] == WAIT ? "W" : "L");
sprintf( buffer, "%1s:%1s %2dDay %02d:%02d, pBattery, pStatus, days, hours, minutes, seconds);

werkt niet, ik weet ook niet precies wat ik ervoor moet zetten voor de setup.

nogmaals bedankt ik kan hier weer mee verder, hopelijk tot een goed resultaat, in ieder geval veeel hoopvoller dan de Oled en hetgeen ik geprobeerd had.

Ik zal nog heel veel moeten leren... maar met hulp zoals van jou kom ik er ooit wel? (hoop ik)

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: tijdschakelaar

Berichtdoor nicoverduin » 31 Okt 2016, 21:26

Als je minuten kleiner zijn dan 10 en je print het af, hoe komt het er dan uit te zien?
En "werkt niet" is wel heel erg vaag.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 31 Okt 2016, 21:57

ik heb inmiddels door waarom: if( hours < 10) nl van 0 tot 9 =01, 02 enz na 10 zou het 10 , 11 moeten worden. maar na 10 krijg ik 10,11 enz te zien als 01.
code:

if ( days < 10) // functie onbekend
lcd.print(F( " "));
lcd.print( days);

// print hours
lcd.setCursor( 8, i);
if ( hours < 10) // functie onbekend
lcd.print(F( "0"));
lcd.print( hours);

// print minutes
lcd.setCursor( 11, i);
if ( minutes < 10); // functie onbekend
lcd.print(F( "0"));
lcd.print( minutes);

// print seconds
lcd.setCursor( 14, i);
if ( seconds < 10); // functie onbekend
lcd.print(F( "0"));
lcd.print( seconds);

verder mijn opmerking "werkt niet" (met toevoeging ïk weet ook niet wat er in de setup moet)

van:

char *pBattery = (i == 0 ? "A" : "B");
char *pStatus = (battery_state[i] == WAIT ? "W" : "L");
sprintf( buffer, "%1s:%1s %2dDay %02d:%02d, pBattery, pStatus, days, hours, minutes, seconds);

bedoel ik "ik zie niets op display!"

ik zal nog proberen eea aan te passen,
volgens mij moet ik (in voorbeeld 1) voor 10 de positie op bv 14 hebben en NA 10 op positie 13 ?

groet Wim

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 31 Okt 2016, 22:08

probleem voor voorbeeld 1 opgelost .... ik had een paar ; te veel staan

laatste stuk nu:

if ( days < 10)
lcd.print(F( " "));
lcd.print( days);

// print hours
lcd.setCursor( 8, i);
if ( hours < 10)
lcd.print(F( "0"));
lcd.print( hours);

// print minutes
lcd.setCursor( 11, i);
if ( minutes < 10)
lcd.print(F( "0"));
lcd.print( minutes);

// print seconds
lcd.setCursor( 14, i);
if ( seconds < 10)
lcd.print(F( "0"));
lcd.print( seconds);

dit lijkt ok nu.

de
char *pBattery = (i == 0 ? "A" : "B");
char *pStatus = (battery_state[i] == WAIT ? "W" : "L");
sprintf( buffer, "%1s:%1s %2dDay %02d:%02d, pBattery, pStatus, days, hours, minutes, seconds);

snap ik nog niet.

bedankt

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

Re: tijdschakelaar

Berichtdoor Koepel » 31 Okt 2016, 23:26

Bijvoorbeeld als de uren '3' zijn, dan maak ik er '03' van. Dat staat netter. En laat nu net de sprintf() daarvoor gemaakt zijn, om zulke dingen te kunnen definiëren met de format string. Maar dat kun je vergeten hoor, je hoeft het niet te gebruiken.

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 31 Okt 2016, 23:36

Koepel,

de 3 en/of 03 had ik inmiddels ( door try and error ) uitgevonden, de sprintf() lukt nog niet (krijg niets op scherm misschien fout in setup?) , maar dat ga ik nog verder proberen , het gaat er ook om dat ik ( en misschien meelezers) iets leer, en niet alleen om het project.

jij nog bedankt, zonder jou had ik er veel langer over gedaan en was het nooit zo'n duidelijke code geworden, ooit leer ik het misschien.

de schakeling draait nu test (op werkelijke tijden) , heb komende periode ook minder tijd (dienstreis en familie) , maar zal eea zeker af maken.

misschien pak ik (als alles werkt) ook de Oled nog uit de kast, met jouw voorbeeld, zou dat ook moeten werken.

groet Wim

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: tijdschakelaar

Berichtdoor nicoverduin » 01 Nov 2016, 09:40

Ik denk dat je de tekst van koepel niet helemaal hebt begrepen. Het is een alternatieve manier om die regel op te bouwen. sprintf() zet het resultaat in een 'buffer'. Die moet dus groot genoeg zijn voor je LCD regel (16 + 1 bytes). Je moet natuurlijk nog wel de cursor zetten naar het begin van de regel die je wilt tonen en uiteraard de LCD.print(buffer) uitvoeren. Anders zie je inderdaad niets. Koepel; gaf je een richting aan. De bedoeling is dat je er dan een verdere invulling aan geeft.
Je had kunnen googelen wat sprintf() doet als ook de LCD functies.....
Zo leer je vissen en niet vis eten...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 01 Nov 2016, 22:03

@Nico,

ik had er LCD Print (buffer) onder gezet.
maar zoals gezegd ga ik eea nog eens rustig lezen en uitwerken.

ik vindt dat je nogal negatief reageert, Waarom?, of is mijn gevoel onjuist? , vergeet niet dat jij het ook ooit moest leren, ik probeer te programmeren, maar het blijkt zonder opleiding daarin, niet echt eenvoudig, (ook mijn tijd is beperkt werk, familie andere hobby, enz).
Het volgen en bouwen van de "voorbeelden" is niet zo moeilijk, maar waar we het nu over hebben komt niet in de voorbeelden.

Hoop dat je ook geduld hebt met beginnende "programmeurs" , gelukkig is de elektronica geen probleem voor mij, anders werd het helemaal moeilijk.

@Koepel,

Bedankt voor alle geduld, uitleg en voorbeeld code's , het heeft mij heel goed geholpen met dit project, maar gezien het grote aantal lezers ook vele andere.

het voor jou normale gebruik van C++ blijkt voor leken als ik erg lastig, ik hoop ooit jou niveau te bereiken........

Groet Wim

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten