1 Knop 3 acties

Arduino specifieke Software
Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

1 Knop 3 acties

Berichtdoor hv0805 » 14 Feb 2015, 16:40

Hallo,

Ik heb volgende probleem wat ik maar niet tot een goed einde kan brengen.
Ik heb 1 drukknop.
3 routines:, Datum_LCD(), Water_LCD() en bargraph_LCD().
Bedoeling:
Als ik 1e maal druk moet er op de LCD de datum en tijd verschijnen (Datum_LCD voor ongeveer 10 seconden).
Als ik een 2e maal druk moet de Water_LCD() routine zijn info weergeven
Als ik een 3e maal druk de bargraph_LCD routine geeft een bargraph weer.
bij de 4 druk komt de datum weer te voorschijn.
elke info staat niet langer dan 10 seconden op de LCD, dan gaat die uit (lcd.off())

Elke routine op zich werkt zoals het hoort. Kan ik testen door in de loop() routine per routine te zetten en dan compileren en up te loaden.

Ik heb al zowat 5 mogelijkheden geprobeerd maar steeds zonder succes. Ofwel is er maar 1 routine die werkt, ofwel wordt alles over elkaar geschreven....
Wie kan mij op weg zetten hoe ik het moet doen. U hoeft hier geen volledig programma te schrijven voor mij, een (gedetailleerde) uitleg volstaat hopelijk wel.
eventueel een flow diagramma.

Dank U

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 1 Knop 3 acties

Berichtdoor shooter » 14 Feb 2015, 17:51

zonder jouw programma lijst kan ik niet veel.
zet jouw routines niet in de loop maar eronder.
int actie =1;
in de loop komt dan iets van
if( knop AND actie=1 ){datum();}
if..... =2 {water...}

in datum zet je actie op 2 enz.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

Re: 1 Knop 3 acties

Berichtdoor hv0805 » 16 Feb 2015, 12:26

Dank u Shooter voor de tip, het werkt nu maar ik heb nu een andere gerelateerd probleem:

In de loop staat:

loop()
{
if (drukknop==0 && (millis()- debounceKnop >= debouncing_time) && display==1)
{
tijd=millis();
lcd.setBacklight(HIGH);
lcd.on();
lcd.clear();
bargraph_LCD();
}

}

void bargraph_LCD()
{
while (millis()-tijd <= 5000)
{
lcd.setCursor(0,0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11,1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut,500);

}
lcd.setBacklight(LOW);
lcd.off();
display=3;
debounceKnop=millis();

}

lbg.drawvalue komt van de library LcdBarGraph http://playground.arduino.cc/Code/LcdBarGraph

Probleem: De eerste maal de arduino opstart en ik op de knop druk wordt de bargraph getoond.
De andere schermen worden ook getoond als ik nogmaals op de knop druk maar de bargraph komt niet meer te voorschijn, wel de andere tekst (lcd.print....) in de routine.

Ik heb geen idee waarom.

Wie wel?

Herman

Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

Re: 1 Knop 3 acties

Berichtdoor hv0805 » 16 Feb 2015, 12:27

Dank u Shooter voor de tip, het werkt nu maar ik heb nu een andere gerelateerd probleem:

In de loop staat:

loop()
{
if (drukknop==0 && (millis()- debounceKnop >= debouncing_time) && display==1)
{
tijd=millis();
lcd.setBacklight(HIGH);
lcd.on();
lcd.clear();
bargraph_LCD();
}

}

void bargraph_LCD()
{
while (millis()-tijd <= 5000)
{
lcd.setCursor(0,0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11,1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut,500);

}
lcd.setBacklight(LOW);
lcd.off();
display=3;
debounceKnop=millis();

}

lbg.drawvalue komt van de library LcdBarGraph http://playground.arduino.cc/Code/LcdBarGraph

Probleem: De eerste maal de arduino opstart en ik op de knop druk wordt de bargraph getoond.
De andere schermen worden ook getoond als ik nogmaals op de knop druk maar de bargraph komt niet meer te voorschijn, wel de andere tekst (lcd.print....) in de routine.

Ik heb geen idee waarom.

Wie wel?

Herman

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

Re: 1 Knop 3 acties

Berichtdoor nicoverduin » 16 Feb 2015, 15:20

het kan handig zijn als je in de loop nog eens een keer de knop leest....los van de gekozen programmatische oplossing die nogal wat onnodige code heeft
Daarnaast kan het handig zijn om mensen uit te nodigen de code te lezen deze tussen [ code2=cpp ] en [ /code2 ] tags (en dan zonder de spaties). Dat leest een stuk beter. En dan was het mogelijk opgevallen dat je aan het einde van van die barfunctie display op 3 zet en je dus in de loop nooit meer in die if komt.
Tenslotte zou ik de hele code hier neerzetten. Nu weet niemand wat je in de setup doet.
Tenslotte, een beetje commentaar kan ook geen kwaad zeker als je zelf door de code moet spitten...

cpp code
loop()
{
if (drukknop==0 && (millis()- debounceKnop >= debouncing_time) && display==1)
{
tijd=millis();
lcd.setBacklight(HIGH);
lcd.on();
lcd.clear();
bargraph_LCD();
}

}

void bargraph_LCD() {
while (millis() - tijd <= 5000) {
lcd.setCursor(0, 0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11, 1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut, 500);

}
lcd.setBacklight(LOW);
lcd.off();
display = 3;
debounceKnop = millis();

}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

Re: 1 Knop 3 acties

Berichtdoor hv0805 » 16 Feb 2015, 18:35

Dank U, Ik zal eraan denken.

De code is maar een deel van het geheel dat op zich ongeveer 450 lijnen lang is. De knop wordt wel degelijk 3 maal uitgelezen.
Om mij te helpen, wat kan er anders geschreven worden in dit stukje? Wat is er onnodig?

Het probleem van de bargraph?

Dank u

Herman

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

Re: 1 Knop 3 acties

Berichtdoor nicoverduin » 16 Feb 2015, 21:04

bijvoorbeeld:
cpp code
while (millis() - tijd <= 5000) {
lcd.setCursor(0, 0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11, 1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut, 500);
}

je laat dit loopen gedurende een max van 5 seconden. Waarom ga je dit elke keer laten displayen. Het veranderd toch niet?

alternatief:
cpp code
lcd.setCursor(0, 0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11, 1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut, 500);
while (millis() - tijd <= 5000) {};

En gezien de huidige insteek had je zelfs gewoon delay(5000) kunnen gebruiken. Effect is hetzelfde.

Een andere manier is ook mogelijk maar dan moet je met timers gaan werken maar dan moet ik ff de hele code hier zien.

Beetje op de gok omdat de rest van het programma ontbreekt
cpp code
loop()
{
//
// als de knop nog ingedrukt is na de debounce tijd en displaymode = 1?
//
if (drukknop==0 && (millis()- debounceKnop >= debouncing_time) && display==1)
{
//
// toon de grafiek op het LCD
//
tijd=millis(); // start de timer
lcd.setBacklight(HIGH); // LCD backlight hoog
lcd.on(); // ze de LCD aan
lcd.clear(); // wis het scherm
bargraph_LCD(); // toon de grafiek
}
//
// als de timer loopt
//
if (tijd != 0) {
//
// als de tijd is verlopen
//
if (millis() - timer > tijd) {
//
// voer LCD afsluitende acties uit
//
lcd.setBacklight(LOW); // dim de LCD
lcd.off(); // en zet hem uit
display = 3; // onduidelijk wat de functie hier van is
debounceKnop = millis(); // het is mij niet duidelijk wat de rol van debounce knop hier is
tijd = 0; // zet de timer uit
}
}
//
// en nu kun je nog allerlei zaken doen zonder dat je op het LCD hoeft te wachten
//
}

void bargraph_LCD() {
lcd.setCursor(0, 0);
lcd.print(F("Inh put:"));
lcd.print(Inhoud_regenwaterPut);
lcd.setCursor(11, 1);
lcd.print(F("%:"));
lbg.drawValue(Inhoud_regenwaterPut, 500);
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

Re: 1 Knop 3 acties

Berichtdoor hv0805 » 17 Feb 2015, 09:53

Nicoverduin,

Dit ziet er inderdaad een stuk beter uit. Ik stam nog uit het lampentijdperk toen het woord computer nog niet bestond. Zelfs de "bug" moest nog uitgevonden worden. Het programmeren heb ik zelf een beetje geleerd. Ben intussen al wel 30jaar met computers bezig maar dan vooral (Novell) Netwerken. Programmeren komt daar niet bij te pas.
U zegt dat ik Delay(5000) ook kan gebruiken, ik dacht dat het programma dan gedurende die hele tijd zit te wachten, met "while (millis() - tijd <= 5000) {};" niet of ben ik volledig verkeerd?
Ik heb drie displays (Water_LCD, Tijd_LCD en Bargraph_LCD) vandaar de "display = 3;" Pas na het indrukken van de knop laat ik iets op de LCD zien. Deze hoeft niet constant te branden.
In bijlage de volledige code. Sommige zaken zoals het gedeelte van "streaming" is niet niet geïmplementeerd, dat zou de volgend stap zijn. Ik laat dit telkens een aantal dagen lopen, controleer dan en breng dan wijzigen aan waar ik denk dat het nodig is. Programmeren is zoals kinderen, eerst kruipen, dan stappen en dan pas lopen.
Bijlagen
marlierNew.7z
(4.46 KiB) 370 keer gedownload

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

Re: 1 Knop 3 acties

Berichtdoor nicoverduin » 17 Feb 2015, 11:43

millis() is niet meer dan een tellertje dat elke milliseconde eentje optelt en na iets van 49 dagen weer opnieuw begint. Meer is het niet. Dus als ik een while (millis() - tijd <= 5000) {}; doe, dan doe ik niets anders dan wachten tot hij klaar is. Dus in feite net als delay(5000); In beide geval doet de processor verder niets.
In dat laatste voorbeeld kijk ik of millis() (een soort master counter) voorbij het tijdstip is. Zo niet hoef je ook niets te doen en kun je andere dingen doen. Zo ja, dan komt de code in actie. door vooraf een test te doen of de timer gelijk is aan 0, kan ik een timer aan en uit zetten. Zet je hem op 0 dan doet hij verder niets. Is hij ongelijk aan 0 dan moet er wat gebeuren.
Dus in algemene zin:
cpp code
//
// als de timer loopt
//
if (tijd != 0) {
//
// als de tijd is verlopen
//
if (millis() - timer > tijd) {
//
// de timer is verlopen dus doe wat je dan wilt doen
//
.......
//
// als je de timer weer wilt starten voor de volgende keer dan moet je dat doen met
//
timer = millis();
//
// wil je hem uitzetten dan
//
timer = 0;
}
}

De grap is dat op deze manier je wel 100 verschillende timers (als ze niet de te kort duren want dan ga je achter lopen) met daar aan verbonden activiteiten kan bedienen en krijg een soort "pseudo" parallel verwerking.
EN je krijgt stukken code die onafhankelijk zijn van andere. Dus gefocused op een ding.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 43
Geregistreerd: 09 Jan 2015, 15:09

Re: 1 Knop 3 acties

Berichtdoor hv0805 » 17 Feb 2015, 12:11

Dank u, het zal even uitproberen en testen worden om al mijn "timers" in de code te vervangen. Wel bedankt voor de hulp, ik ben weer een paar weken zoet.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: enofayeliaj en 49 gasten