Sida 1 av 2

Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 10:34:16
av fosfor
Hej!

Jag har en funktion nedan för att försätta MEGA'n i Sleep Mode, LCD'n stängs även av.
Men kom på att det vore ju smidigare om detta sköttes själv istället för med en knapp (som man kan glömma trycka på).
Så istället för koden för knapp, så är jag ute efter en simpel timerfunktion som helt enkelt kör vidare med Sleep Mode koden
efter att en viss tid av inaktivitet passerat.

Någon som skulle kunna peka mig i rätt riktning gällande detta? :)

Kod: Markera allt

{

//--- Här skulle kod med timer behövas sättas in och ersätta de två raderna nedan

    val = digitalRead(GoToSleepPin);                            // Knapp som sparar position och går in i SLEEP MODE
    if (val == HIGH) {                                                 // Kollar om knappen är tryckt

      UserStopPulseCount4 = PulseCount;                              //
      EEPROM.put(24, UserStopPulseCount4);                        // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1);                  //
      lcd.setCursor(0, 1);                                                      // Bestämmer vart texten ska synas på LCDn
      lcd.print(PulseCount);
      delay(750);
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      lcd.clear();                                                  // Tömmer skärmen
      lcd.setCursor(3, 1);                                      // Visar Zzzz... på andra raden av LCD
      lcd.print("Zzzzzzz...");                                  // Sista meddelandet innan den stänger ner
      delay(1050);                                               // Hur länge meddelandet visas på skärmen
      lcd.noDisplay();                                           // Stänger av LCD, men inte belysningen
      lcd.noBacklight();                                        // Stänger av belysningen - Fungerar!
      sleepNow();                                                // Aktiverar SLEEP MODE
    }
  }

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 10:43:38
av Klas-Kenny
Ha någon variabel typ "unsigned long timeAtLastActivity", sen vid varje aktivitet så kör

Kod: Markera allt

timeAtLastActivity = millis();
Sen för kontrollen

Kod: Markera allt

if(millis() - timeAtLastActivity > TIMEOUT_IN_MS) {
   // Go to sleep
}

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 11:38:28
av fosfor
Klas-Kenny:

Tack!

Har testat lite nu, men maskinen går i Sleep Mode direkt, fastän jag skriver if(millis() - timeAtLastActivity > 5000);
så väntar den inte 5 sekunder?

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 12:57:33
av Shimonu
Du ska ju inte ha semikolon efter villkoret

.

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 13:02:05
av svanted
if((millis() - timeAtLastActivity) > 5000)
{





}

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 13:36:57
av fosfor
Hmmm, sätter jag den på 5000 så händer inget alls, sätter jag den på 500 så går den till sleep Direkt.
Har även testat skriva det såhär if((millis() - timeAtLastActivity) > 5000)
:humm:

Kod: Markera allt

  {
if(millis() - timeAtLastActivity > 5000)                         //--- Här skulle kod med timer behövas sättas in och ersätta de två raderna nedan
{

    // val = digitalRead(GoToSleepPin);                            // Knapp som sparar position och går in i SLEEP MODE
    // if (val == HIGH) {                                          // Kollar om knappen är tryckt


      UserStopPulseCount4 = PulseCount;                         //
      EEPROM.put(24, UserStopPulseCount4);                      // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1);                  //
      lcd.setCursor(0, 1);                                      // Dessa två rader skriver till LCD, 0, är första eller andra rad ,3 är hur långt bort bokstaven placeras från vänster
      lcd.print(PulseCount);
      delay(750);
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      lcd.clear();                                              // Tömmer skärmen
      lcd.setCursor(3, 1);                                      // Visar Zzzz... på andra raden av LCD
      lcd.print("Zzzzzzz...");                                  // Sista meddelandet innan den stänger ner
      delay(1050);                                              // Hur länge meddelandet visas på skärmen
      lcd.noDisplay();                                          // Stänger av LCD, men inte belysningen
      lcd.noBacklight();                                        // Stänger av belysningen - Fungerar!
      sleepNow();                                               // Aktiverar SLEEP MODE
    }
  }

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 13:40:53
av fosfor
Inte så att jag måste aktivera något bibliotek för att använda millis funktionen?

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 13:50:25
av johano
Hur och var sätter du timeAtLastActivity ?
Det finns en måsvinge alldeles ovanför din if(millis() - timeAtLastActivity > 5000), vad härrör den till?

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 14:08:28
av fosfor
Johano: Jag har skrivit den som Klas-Kennys exempel högre upp i tråden.

Kod: Markera allt

// Bland alla long och int
unsigned long timeAtLastActivity;


// Funktionen nedan där jag vill att timern ska kicka in efter en viss tid, den ska alltså gå i sleep mode efter en stunds inaktivitet.
  {
if((millis() - timeAtLastActivity) > 5000)
// if(millis() - timeAtLastActivity > 5000)                      //--- Här skulle kod med timer behövas sättas in och ersätta de två raderna nedan
{

    // val = digitalRead(GoToSleepPin);                            // Knapp som sparar position och går in i SLEEP MODE
    // if (val == HIGH) {                                          // Kollar om knappen är tryckt


      UserStopPulseCount4 = PulseCount;                         //
      EEPROM.put(24, UserStopPulseCount4);                      // Skriver PulseCount numret till minnet, adressen är 24
      EEPROM.put(28, UserStopPulseCount4 + 1);                  //
      lcd.setCursor(0, 1);                                      // Dessa två rader skriver till LCD, 0, är första eller andra rad ,3 är hur långt bort bokstaven placeras från vänster
      lcd.print(PulseCount);
      delay(750);
      Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
      lcd.clear();                                              // Tömmer skärmen
      lcd.setCursor(3, 1);                                      // Visar Zzzz... på andra raden av LCD
      lcd.print("Zzzzzzz...");                                  // Sista meddelandet innan den stänger ner
      delay(1050);                                              // Hur länge meddelandet visas på skärmen
      lcd.noDisplay();                                          // Stänger av LCD, men inte belysningen
      lcd.noBacklight();                                        // Stänger av belysningen - Fungerar!
      sleepNow();                                               // Aktiverar SLEEP MODE
    }
  }



// -- Åka upp knappen, om den används vill jag att timern resettar sig
  {

// -- Timer
timeAtLastActivity = millis();
    
    int valfast = digitalRead(HighSpeed1Pin);            // Åker UPP snabbt
    int valslow = digitalRead(SlowSpeed1Pin);            // Åker UPP långsamt
    if (valfast == HIGH || valslow == HIGH)              // Checkar om knappen trycks
    {
      if (valfast == HIGH)
        analogWrite(controlPin2, 255);                   // 255 är PWM som blir 5V ut, denna ser till att motorn snurrar snabbt/100%
      else if (valslow == HIGH)
        analogWrite(controlPin2, 210);                   // Valfri siffra, denna går långsammare
      lcd.setCursor(0, 1);                               // -------- Dessa rader visar UP när uppåtknapp trycks UPP
      lcd.print("Up");
      Serial.println("Going up");
      delay(10);                                         // Delay ställer flimret men slöar också ner visningen av pulsräkningen


Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 14:11:39
av Shimonu
Åh, jösses

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 14:18:44
av X-IL
Du får nog försöka klippa i koden så det går att se om du gjort rätt eller fel.
Det du visar oss nu kommer inte att kompilera. Det KlasKenny visade var ju ett exempel, detta måste ju så klart läggas in på rätt sätt i koden, nu när vi ser "orpahned" måsvingar och grejer så har vi ingen aning om vad du gjort.

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 14:39:53
av ffredrik
Jag har sagt det sedan länge; detta kommer aldrig att gå väl..

Grundkurs rekommenderas.

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 22 maj 2019, 14:50:12
av johano
Posta programmet i sin helhet, du har nu klippt bort massa saker som är högst väsentliga för att förstå vad programmet gör och
framförallt varför det *inte* gör det du vill/tror att det ska göra.

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 23 maj 2019, 08:37:54
av fosfor
Okok ska återkomma med hela koden.
Men jag undrar, denna rad har skrivits på två olika sätt från två olika personer här.

if((millis() - timeAtLastActivity) > 5000)
vs
if(millis() - timeAtLastActivity > 5000)

Spelar det ingen roll hur detta skrivs eller?
Eller var det bara en miss från något håll.

Re: Timer / räknare istället för knapp? Arduino MEGA

Postat: 23 maj 2019, 09:13:20
av X-IL
ffredrik>>> Alla är vi barn i början. Skadar inte att vara lite ödmjuk.

fosfor>>> Nej, i det specifika fallet spelar det inte nån roll vilket av dem man skriver. - operatorn har förtur framför jämförelsen. se t ex: https://en.cppreference.com/w/c/languag ... precedence
Det är mes stor sannolikhet nån annanstans det inte är riktigt rätt. Men en grej som någon såg tidigare men som du verkar ha tagit bort nu var ditt semikolon direkt bakom IF-satsen, detta borde visserligen ge en kompilatorvarning, men i övrigt så skulle det kunna betyda "Om det här stämmer, gör ingenting", vilket nog inte var det du ville?