Datorn iFokus

Datorn

Läst 71 ggr
Bjorne
2022-08-17 14:17
0

Arduino Delay

För något år sedan började jag använda en Arduino Uno och trängde med stort besvär in i C språket. ( Gammal Basicvän). Till slut lyckades jag tränga in så pass att jag kunde skapa några användbara program . Avläsning av dagsljuset, motorstyrning av lysomkopplare och liknande triviala saker.
Nu hittade jag arduinon i en låda och tänkte se om jag kunde väcka upp minnet av hur man gjorde. Jag hade glömt allt.
Det visade sig att "Delay()"; kommandot inte verkade fungera längre.
Kommenterar man bort den rullar programmet i full fart. Har man delayen kvar stannar programmet där.
Någon som har en aning om vad som är fel?
om man googlar verkar det vara andra som opckså har problem med Delay().
Jag skickar med en enkel testsnutt som beter sig som jag har beskrivit.
a skall räknas upp från 10 till 19
Med dely() stannar allt vid a=10
utan delay rullar det i maxfart


// include the library code:
#include
#include

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int main () {

int a;
b=1000;
lcd.clear();
lcd.begin(16,2);
/* for loop execution */
for( a = 10; a < 20; a = a + 1 )
{
lcd.print(a);
delay(1000);
}

return 0;
}

Niklas
2022-08-17 14:24
0
#1

Nu kan jag inte C, men loopen ser mer ut som Basic. Skriv a++ i stället för a = a + 1 och se om det blir någon skillnad.


Vänliga hälsningar, Niklas

Sök information om Sveriges adelssläkter för din släktforskning

johan
2022-08-17 14:42
1
#2

#1: Det kommer ge samma resultat. Bara syntaktiskt socker, båda gör exakt samma sak.

#0: Jag har aldrig hållit på med C eller Arduino, men min gissning är att delay verkligen pausar hela tråden och därmed fryser allt som körs.

Det är nog mer vanligt att man har en loop som istället kontroller om en viss tid har gått sedan förra gången den kördes. Du får ett kodexempel för helt påhittad pseudo-kod eftersom jag inte kan C, men kanske tillräckligt hjälp för att du ska kunna googla dig till hur man gör i C.

main() {
    int counter = 10;        
    int lastMilli = milliseconds(); // Get milliseconds from current date/time
    while {
        print(counter)

        // Kolla att det gått 1 sekund (1000 ms)
        if (milliseconds() - lastMilli > 1000) {
            lastMilli = milliseconds();
            counter++;
        }

        // Avsluta loop vid 19
        if (counter > 19) {
            break;
        }
    }
}

Vad denna kod gör är att den körs precis hela tiden så snabbt processorn kan och ökar räknaren och sparar undan senaste värdet för millisekunder om det gått en sekund.

När räknaren är mer än 19 avslutas loopen.

Mvh // Johan

Bjorne
2022-08-17 16:30
0
#3

Niclas, det är inte loopen som är problemet, den funkar.
Problemet är att den här programsnutten liksom flera andra inte längre fungerar med
Delay. Det har de gjort tidigare. Utan Delay så rullar loopen.
Johan Jag känner till millis och det kan vara ide att använda den istället även om det krånglar till saken. Men det förklarar inte huvudproblemet. Att Delay plötsligt har slutat att fungera. Kan det ha med något bibliotek att göra?

johan
2022-08-17 16:50
0
#4

#3: Ingen aning.

Du får kanske titta i dokumentation om det är några breaking changes kring den funktionen.

Mvh // Johan

Niklas
2022-08-18 08:35
0
#5

#3: Okej. Om du förenklar programmet för att testa delay()-funktionen då, ungefär så här, kan du få den att blinka då?


// include the library code:
#include
#include

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int main () {

lcd.clear();
lcd.begin(16,2);

lcd.print(a);
delay(1000);
lcd.print(a);
delay(1000);
lcd.print(a);
delay(1000);

}


Här hittade jag ett exempel som använder millis i stället för delay():

» Why You Shouldn’t Always Use the Arduino Delay Function | Random Nerd Tutorials


Vänliga hälsningar, Niklas

Sök information om Sveriges adelssläkter för din släktforskning

The very first time that you use an Arduino board, you probably uploaded the default blink project with the delay function, but there is a better solution
Bjorne
2022-08-21 14:48
1
#6

Nu tror jag att jag har hittat felet.
Jag ber om ursäkt för allt onödigt besvär jag har förorsakat i min dumhet.
I Arduinoprogramet under filer/inställningar finns en rad som heter skissblockplats
på svenska, Arduino kallar ju programmen för sketcher av någon anledning.
Där skall programmen man skriver ligga. Ligger de någon annan stans blir det vajsing
på bla. Comportarna.
Mina program hamnade ju i början på onedrive.
Det måste ha varit när jag flyttade bort dem därfrån som det blev fel.
Hoppas det kan hjälpa någon annan om det finns någon som är lika korkad.

Niklas
2022-08-22 07:31
0
#7

Vad bra att det löste sig. Tack för att du delade med dig!


Vänliga hälsningar, Niklas

Sök information om Sveriges adelssläkter för din släktforskning