Avatar billede Balls_of_Kevlar Nybegynder
31. januar 2012 - 16:58 Der er 11 kommentarer

Arduino Code

Hej

Jeg vil lave et binært ur til min storebror, og har fået styr på hardware delen (tror jeg). Men softwaren er jeg ikke så sikker på. Det er min første gang og valgte derfor et binært ur fordi det er jo bare nogle led'er der slukker og tænder. Hvis i kender binære ure så ved i at den ved 1 sekundt skal tænde når der er gået 1 sekundt, og tænder sammen med 2 sekunderen når der er gået 3 sekunder (2+1=3). Så jeg havde tænkt mig at lave en kode noget lignende det her for hver led:

void loop() {
  digitalWrite(13, HIGH);  // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(2000);              // wait for a second
  digitalWrite (13, HIGH);
  delay(1000);
Dette ville virke for 1 sekunders led'en, til at vise når der er gået 1 sekund, og sammen med 2 sekunders led'en vil det vise at der er gået 3 sekunder.
Men hvordan kan jeg tænde 2 sekunders led'en på samme tid som 1 sekunders led'en? Og hvad så når time led'erne skal på?

Tak,
Sofus Christensen
Avatar billede kentora Nybegynder
31. januar 2012 - 17:26 #1
Først og fremmest skal du have en udgang til hver LED. det vil sige 6 til sekunder (59 sekunder = 111011), lige så mange til minutterne og 5 til timerne (23 timer = 10111). De vil sige 17 udgange. Det er der ikke på en arduino UNO. Nu ved jeg ikke hvilken model du har, men det er vidst den mest gængse.

Hvis det skal være et rigtigt ur vil jeg gerne vide hvor du henter tiden? Eller skal det bare være et ur der tæller op?

Hvis det bare er et ur der tæller op kan du evt. udlade timer, og så bare bruge 12 LED'er.

Nu kan du tage for hver LED og sætte HIGH/LOW for hver LED, men det er lidt besværligt, og giver ikke en særlig pæn kode.

Hvis du derimod sætter et array op til dine LED'er, og en til dine tidsenheder, lignende det her:
int[] leds = { 1, 2, 3, 4, 5, .. , 12 };
int[] timespans = {1, 2, 4, .. , 32, 60, 120, 240, .. , 1920 }

Som du kan se skifter jeg fra et mellemrum på 1 ved sekunder til 60 ved minutter. 1 minut er som bekendt 60 sekunder. Nu kan du lave det hele i din loop med en for lykke. Det næste her er (nogenlunde) pseudo kode, da jeg ikke vil give svaret væk, jeg fornemmer også at du gør dette for at lære :).

void loop(){
    tid = millis
    int[] state;
    for hver timespan, nummer i
        hvis tid >= timespan[i]
            tid = tid - timespan
            state[i] HIGH
        ellers
            state[i] LOW
    for hver state, nummer i
        sæt leds[i] state[i]
    vent 1 sekund
}

er rigtig dårlig til pseudo kode, men håber at du finder ud af noget, og at du kan forstå min kode, der er et dejligt afbræk midt i mit studie retnings projekt :)
Avatar billede Balls_of_Kevlar Nybegynder
31. januar 2012 - 18:37 #2
Hej

Det skal være et ur der kan vise hvad klokken er.
Jeg vil bruge chippen fra en Duemillinove fra Letelektroonik, den har vist nok in-/outputs.
Jeg vil skrive det i programmerings-sproget Wiring, og jeg ander intet af det der pseudo.

Jeg håber det var den info du skulle bruge, Tak

Sofus Christensen
Avatar billede kentora Nybegynder
31. januar 2012 - 19:08 #3
Har du et real time clock modul? Eller hvordan vil du finde ud af hvad klokken rent faktisk er?

pseudo kode er bare hvor man går igennem hvad koden skal gøre. Det vil sige at koden ikke vil fungere, men er en opskrift på hvordan du skal eller kan lave din kode :)

http://en.wikipedia.org/wiki/Pseudocode
Avatar billede Balls_of_Kevlar Nybegynder
02. februar 2012 - 13:21 #4
Nej men jeg ville bare sætte det i gang på et bestemt tidspunkt.

og ok

Jeg forstår stadig ikke din pseudo-code, men kunne du skrive hvordan du ville gøre det ved bare en led :-)
Avatar billede Balls_of_Kevlar Nybegynder
05. februar 2012 - 16:12 #5
Forstår du hvad jeg mener?
Avatar billede kentora Nybegynder
06. februar 2012 - 07:26 #6
Problemet er jo bare at du ikke kan vise klokken med en enkelt LED.

Jeg forstår dit spørgsmål sådan her:
"Skal jeg tænde eller slukke hver LED hver gang koden kører igennem?". Er det en rigtig omformulering af dit spørgsmål?

Til det er svaret: JA. Alternativet er at have en array med om de var tændt eller slukkede sidste gang koden kørte, men så skal du bruge flere if sætninger, og så tror jeg at det kræver mere ressourcer.
Avatar billede Balls_of_Kevlar Nybegynder
06. februar 2012 - 18:19 #7
Jeg ved godt at jeg skal bruge 17 led'er, jeg mente mere om du kunne vise hvad du ville gøre med bare en af dem.
Mit spørgsmål er mere om hvordan jeg får led'erne til at delay'e den tid de skal uden at delay'e resten af koden.
Avatar billede kentora Nybegynder
06. februar 2012 - 18:39 #8
Jeg forstår ikke hvorfor det er at du ikke vil lade resten af koden delaye, men det du kan gøre er at tænde for en led, lave en if sætning der tjekker om tiden er gået, og så slukker den. Men som sagt så forstår jeg ikke grunden til at du ikke vil lade det hele delaye, og jeg synes du skal prøve at kigge på min pseudo en gang til, og se om du kan forstå hvad det er jeg mener at koden skal gøre.
Avatar billede Balls_of_Kevlar Nybegynder
06. februar 2012 - 20:53 #9
Jeg har kigget på den og forstår ikke "timespan" og det der int og [i]
Avatar billede kentora Nybegynder
07. februar 2012 - 08:16 #10
[] angiver at det er et array, [i] i et for loop, hvor i stiger hver gang, angiver hver enkelt element i array'et. Timespan er et array med de tider dioderne skal repræsentere.
Avatar billede Balls_of_Kevlar Nybegynder
09. februar 2012 - 19:34 #11
Nåååår nu forstår jeg hvad du mener (nogenlunde) GENIAL IDE :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester