1ste keer hulp nodig met code aub

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

1ste keer hulp nodig met code aub

Berichtdoor Space_je » 16 Jun 2017, 14:10

Allen,

Sinds enige tijd bezig met simpele dingen (ledjes aansturen)

Nu heb ik via internet een wekker opgezocht.
deze wekker was standaard geprogrameerd met buzzer.
deze buzzer heb ik eruit gehaald.

Hiervoor in plaats heb ik 2 leds.

Pin 9 moet aangaan indien wekker (ahours en amins) < dan hour en min is.
verder moet pin 12 aangaan indien wekker groter is dan huidige tijd.
Onderstaand de gehele code,

Code: Alles selecteren
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int starttime;
int activetime;
int prevoustime = 0;

int hours = 0;
int mins = 0;

int ahours = 0;
int amins = 0;

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
 
  Serial.begin(9600);
 
  pinMode(13, INPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11, HIGH);
  pinMode(10, INPUT);
  digitalWrite(10, HIGH);
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);
 
 
 pinMode(12, OUTPUT);
 pinMode(9, OUTPUT);
 
  starttime = millis()/1000;
}

void loop()


{
  while(digitalRead(8) == LOW)
  {
    lcd.setCursor(6,1);
    lcd.print("Alarm");
    lcd.setCursor(6,0);
       if(digitalRead(11) == LOW)
    {
     amins++;
    }
    else if (digitalRead(10) == LOW)
    {
      ahours++;
    }
     lcd.setCursor(6,0);
 
  if(ahours < 10)
  {
    lcd.print("0");
    lcd.print(ahours);
  }
  else
  {
    lcd.print(ahours);
  }
   
    lcd.print(":");
   
  if (amins < 10)
  {
    lcd.print("0");
      lcd.print(amins);
  }
  else
  {
      lcd.print(amins);
  }
 if(amins > 59)
     {
      ahours++;
      amins = 0;
     }
     if(ahours > 23)
     {
      ahours = 0;
     }
     delay(500);
     lcd.clear();
  }
 
  if(digitalRead(13) == LOW)
  {
   
    lcd.setCursor(5,1);
    lcd.print("Set Time");
    lcd.setCursor(6,0);
     if(digitalRead(11) == LOW)
    {
     mins++;
    }
    else if (digitalRead(10) == LOW)
    {
      hours++;
    }
   

  }
 
      activetime = (millis() / 1000) - starttime;
      if(prevoustime < (activetime - 59))
      {
       mins++;
       prevoustime = activetime;
      }
     
      if(mins > 59)
     {
      hours++;
      mins = 0;
     }
     
     if(hours > 23)
     {
      hours = 0;
     }
 
 
  lcd.setCursor(6,0);
 
  if(hours < 10)
  {
    lcd.print("0");
    lcd.print(hours);
  }
  else
  {
    lcd.print(hours);
  }
   
    lcd.print(":");
   
  if (mins < 10)
  {
    lcd.print("0");
      lcd.print(mins);
  }
  else
  {
      lcd.print(mins);
  }


if(ahours >> hours && amins >> mins )
{
  digitalWrite(9, HIGH);
  digitalWrite(12, LOW);
}
else
{
    delay(300);
}

 
if(ahours << hours && amins << mins )
{
digitalWrite(9, LOW);
  digitalWrite(12, HIGH);
}
else
{
    delay(300);
}

 
  Serial.println(mins);
  Serial.println(hours);
  Serial.println("");
  Serial.println(amins);
  Serial.println(ahours);
  Serial.println("");
  Serial.println(activetime);
  Serial.println(prevoustime);
  Serial.println(starttime);
  Serial.println("");
}

 


kan iemand mij hierbij helpen?

er zit iets mis bij het stukje

Code: Alles selecteren
if(ahours >> hours && amins >> mins )
{
  digitalWrite(9, HIGH);
  digitalWrite(12, LOW);
}
else
{
    delay(300);
}

 
if(ahours << hours && amins << mins )
{
digitalWrite(9, LOW);
  digitalWrite(12, HIGH);
}
else
{
    delay(300);
}


Alvast bedankt

Advertisement

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 16 Jun 2017, 15:00

Nog even enkele achtergrond info.
Kinderen zijn leuk, echter om 06:00 wakker gemaakt worden is toch wel iets minder.

Ik wil hiermee visueel maken dat het nog bedtijd is.
Dus alarmtijd is 07:00. Zolang het nog geen 07:00 is zal blauw led aangestuurd worden. -> dus blijven slapen of zelf gaan spelen op de kamer.
Indien het na 07:00 is gaat groene led aan waarmee duidelijk is dat ze ons wakker mogen maken.

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

Re: 1ste keer hulp nodig met code aub

Berichtdoor Koepel » 18 Jun 2017, 08:28

Het is een leuk project :D maar er is veel onduidelijk :o

Weet je nog waar je die code voor een wekker hebt gevonden ? Kun je er een link naar geven ?

Wil je het X-tal van het Arduino board gebruiken om de tijd bij te houden ?
Dat werkt best wel goed, maar op sommige Arduino boards zit een resonator in plaats van een X-tal.

Kun je meer commentaar toevoegen ?
Vooral bovenaan de sketch, een beschrijving wat het is, met een datum.
Dat is voor jezelf ook gemakkelijk als je over een paar jaar je eigen sketch weer eens ziet.

Kun je beschrijven waar welke tekst staat op het LCD display ?
Ik doe dat in de code zelf, bijvoorbeeld zo:
cpp code
// 0123456789012345
// ----------------
// 12:48
// 7 januari


Zou je de pin nummers 8,9,10,11,12,13 een naam willen geven ?
Code: Alles selecteren
const int alarmButtonPin = 8;
const int timeButtonPin = 9;
...


Heb je aan pin 8 een knop naar GND ? Heb je aan pin 8 een weerstand naar 5V ?
En de knop op pin 8 indrukken is de alarm tijd goed zetten ?

Dezelfde vragen heb ik voor pin 9. Is die voor de gewone tijd goed zetten ?

Je deelt millis() door 1000. Dat kun je beter niet doen, maar dat zou nog kunnen werken. Het gaat een tijdje goed, maar het moet een keer fout gaan. Ik zie namelijk drie fouten in dat stukje code (het zijn 'signed' integers; millis / 1000 past niet in een integer; met 'previoustime = activetime' wordt het interval vertraagt als er vertraging in de code zit en er zit soms een delay van 300ms in de sketch). Dat het op internet veel wordt overgeschreven, dat betekent nog niet dat het goede code is.

Het eenvoudigste is om millis() altijd met "unsigned long" en altijd in milliseconden te gebruiken.
De BlinkWithoutDelay is de eerste stap om millis() te gebruiken: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Ken je de 'sprintf' functie ? Die kan met één regel code automatisch een tekst in een bepaald formaat maken met aanvullende nullen en zo.

Vergelijken gaat met '>' en niet met '>>'.
Hier staat het beschreven: https://www.arduino.cc/en/Reference/If
Die dubbele dingen zijn voor 'AND' '&&' en 'OR' '||'.

Ik zou iets aan de sketch willen toevoegen. Zodat bijvoorbeeld eenmalig de lamp anders wordt gezet op een bepaalde tijd.

De compiler die je sketch compileert, die weet de tijd van de computer. Het is mogelijk om die tijd naar je sketch te krijgen. Dan kun je bij het uploaden van een sketch automatisch de tijd goed zetten.
Dan kun je niet alleen de tijd maar ook de datum naar je sketch krijgen, dat maakt het zelfs mogelijk (voor gevorderden) om automatisch om te schakelen tussen winter- en zomertijd.

Ben je bereid om libraries te gaan gebruiken ?
Er is een TimeAlarms library: https://www.pjrc.com/teensy/td_libs_TimeAlarms.html
Die werkt samen met de TimeLib: https://www.pjrc.com/teensy/td_libs_Time.html
Die heeft helaas geen automatische zomer- en wintertijd omzetting.

Ik hoop dat je niet teveel van mijn lange verhaal bent geschrokken. Dit is normaal wanneer ik zulke code zie :geek:

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 19 Jun 2017, 20:33

http://fritzing.org/projects/arduino-lcd-alarm-clock

Deze site heb ik als basis gebruikt. Hier word gebruik gemaakt van 4 push buttons. TIME, ALARM, HOURS EN MINS.

Dmv pushbutten kan tijd en alarm ingesteld worden. Daar ik geen rtc heb leek dit me een mooie oplossing.

Voordeel is dat ik tijd opnieuw kan instellen na een spanningsuitval.
Ivm vakantie kan ik momenteel niet bij arduino (uno).
Voordeel is wel dat ik me nog wat kan verdiepen in andere manieren van tijd berekenen.

2de voordeel is als ik alarm tijd aanpas ik hiermee dus direct het gedrag van de leds aanpas zonder dat ik code hoef aan te passen omdat dit niet in code is aangebracht. (Bv. Weekend langer slapen).

Iig alvast bedankt voor het meedenken en ga me zeker verdiepen in bovenstaande link.

Remco

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

Re: 1ste keer hulp nodig met code aub

Berichtdoor Koepel » 20 Jun 2017, 04:03

Met alleen de uren en minuten blijft de code heel eenvoudig, de datum toevoegen maakt het ingewikkelder, maar met zo'n library ben je meteen van die rare code met millis() af.

Ik zit maar te staren naar dat millis()/1000. Ik zie dat echt niet werken en ik krijg er jeuk van. Als je daar een gewone millis timer van maakt en laat zien, dan helpen we je natuurlijk verder.

Dus jij hebt in je vakantie geen Arduino board bij je :?: :mrgreen:

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 25 Jun 2017, 21:21

Heb de leds redelijk perfect werkend.

had in eerste versie nog een issue omdat groene led tot 00:00 aan bleven.
Dit ondervangen door een of functie erbij waarbij deze om 19:00 omgaan naar rood.

onderstaand de code tot dusver.
zoals al van te voren aangegeven door jullie loopt tijd wonderbaarlijk in de ochtend 1 uur voor. (had juist verwacht dat deze achter ging lopen.)

Ik ben vanavond aan het stoeien geweest met de millis als unsigned long.
ik krijg dit echter niet in mijn code verwerkt.
als iemand hier nog tips over heeft dan graag.......(datum hoeft niet weergegeven te worden)

onderstaand de aangepaste code. straks misschien even een filmpje maken ervan.


Code: Alles selecteren
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int starttime;
int activetime;
int prevoustime = 0;

int hours = 0;
int mins = 0;

int ahours = 0;
int amins = 0;

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
 
  Serial.begin(9600);
 
  pinMode(13, INPUT);                           //tijd button
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);                           //minuten button
  digitalWrite(11, HIGH);
  pinMode(10, INPUT);                           // uren button
  digitalWrite(10, HIGH);
  pinMode(8, INPUT);                            // alarm button
  digitalWrite(8, HIGH);
 
 
  pinMode(9, OUTPUT);                         //rode leds
  pinMode(12, OUTPUT);                        //groene leds
  pinMode(A1, OUTPUT);                        // oranje leds
 
  starttime = millis()/1000;
}

void loop()
{
  while(digitalRead(8) == LOW)                  //alarm tijd instellen
  {
    lcd.setCursor(6,1);
    lcd.print("Alarm");
    lcd.setCursor(6,0);
       if(digitalRead(11) == LOW)               // minuten van alarm klok instellen
    {
     amins++;
    }
    else if (digitalRead(10) == LOW)            // uren van alarm klok instellen
    {
      ahours++;
    }
     lcd.setCursor(6,0);
 
  if(ahours < 10)
  {
    lcd.print("0");
    lcd.print(ahours);
  }
  else
  {
    lcd.print(ahours);
  }
   
    lcd.print(":");
   
  if (amins < 10)
  {
    lcd.print("0");
      lcd.print(amins);
  }
  else
  {
      lcd.print(amins);
  }
 if(amins > 59)                                  // min 60 terug zetten nar 0 en 1 uur erbij tellen
     {
      ahours++;
      amins = 0;
     }
     if(ahours > 23)                             // uur 24 terug naar 00:00 zetten
     {
      ahours = 0;
     }
     delay(500);
     lcd.clear();
  }
 
  if(digitalRead(13) == LOW)                    // tijd instellen
  {
   
    lcd.setCursor(5,1);
    lcd.print("Set Time");
    lcd.setCursor(6,0);
     if(digitalRead(11) == LOW)                 // minuten van tijd instellen
    {
     mins++;
    }
    else if (digitalRead(10) == LOW)            // uren van tijd instellen
    {
      hours++;
    }
  }
 
      activetime = (millis() / 1000) - starttime;
      if(prevoustime < (activetime - 59))
      {
       mins++;
       prevoustime = activetime;
      }
     
      if(mins > 59)                             // min van tijd naar 0 ipv 60
     {
      hours++;                                  // 1 uur erbij tellen
      mins = 0;                                 // minuten terug naar 0 zetten
     }
     
     if(hours > 23)                             // uren van 24 naar 0 terug zetten
     {
      hours = 0;
     }

  lcd.setCursor(6,0);
 
  if(hours < 10)
  {
    lcd.print("0");
    lcd.print(hours);
  }
  else
  {
    lcd.print(hours);
  }
   
    lcd.print(":");
   
  if (mins < 10)
  {
    lcd.print("0");
      lcd.print(mins);
  }
  else
  {
      lcd.print(mins);
  }

if((ahours > hours) || hours >= 19 )        // als het te vroeg is om op te staan of het is na 19:00 DAN RODE LEDS BRANDEN.
{
  digitalWrite(9, HIGH);                    //RODE LEDS AAN
  digitalWrite(12, LOW);                    //GROENE LEDS UIT
  digitalWrite(A1, LOW);                    // ORANJE LEDS UIT
 delay(100);
}
else                                         // ALS HET TIJD IS OM OP TE STAAN
{
    digitalWrite(9, LOW);                   //RODE LEDS UIT
  digitalWrite(12, HIGH);                   //GROENE LEDS AAN
  digitalWrite(A1, LOW);                    // ORANJE LEDS UIT
    delay(100);
}
   if (ahours == hours && amins > mins)     // ALS DE WERKELIJKE UREN OVEREEN KOMEN MAAR DE MINUTEN NOG NIET DAN IS HET BIJNA TIJD OM OP TE STAAN
   {
 
   digitalWrite(9, LOW);                     // RODE LEDS UIT
  digitalWrite(12, LOW);                     //GROENE LEDS UIT 
  digitalWrite(A1, HIGH);                    // ORANJE LEDS AAN
 delay(100);

 
}


  lcd.clear();
 

  Serial.println(mins);
  Serial.println(hours);
  Serial.println("");
  Serial.println(amins);
  Serial.println(ahours);
  Serial.println("");
  Serial.println(activetime);
  Serial.println(prevoustime);
  Serial.println(starttime);
  Serial.println("");
}

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 25 Jun 2017, 22:10

https://youtu.be/gVlyGQifVsM
Zie bijgaand de status tot nu.

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

Re: 1ste keer hulp nodig met code aub

Berichtdoor Koepel » 25 Jun 2017, 22:34

Wanneer je een gewone millis() hebt, en de interval optelt bij previousMillis, dan loopt het met de nauwkeurigheid van het X-tal van het Arduino board. Dat gaat altijd goed, het raakt nooit uit de pas.

Je kunt je oude sketch bewaren of een andere naam geven. Daarna kun je eens het onderstaande proberen:

cpp code
//

unsigned long previousMillis;
unsigned long interval = 60000UL; // 1 minute, UL means Unsigned Long

void setup()
{
...

// set previousMillis at the end of setup()
previousMillis = millis();
}

void loop()
{
...
unsigned long currentMillis = millis();
if( currentMillis - previousMillis >= interval)
{
previousMillis += interval; // keep exactly in pace with time, add interval

mins++;
if( mins > 59)
{
mins = 0;
hours++;
if( hours > 23)
{
hours = 0;
}
}
}
...
}


Begrijp je de bedoeling ? Twee globale variabelen erbij. In de loop() en los van de rest de millis() gebruiken op een goede manier. En ik kon het niet laten om de 'mins' en 'hours' op een andere manier te doen.

Als je wilt weten wat je eigen code doet die je zelf geschreven hebt... verbeter dan de layout van de tekst: doe het inspringen, de haakjes, de spaties altijd op een consequente en nette manier.

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 25 Jun 2017, 23:16

dit geeft fout meldingen bij compileren

Berichten: 9
Geregistreerd: 16 Jun 2017, 13:53

Re: 1ste keer hulp nodig met code aub

Berichtdoor Space_je » 26 Jun 2017, 00:30

Ga morgen even alles overtypen ipv kopiëren.
Mogelijk een spatie ofzo of een haakje teveel

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten