Go Down

Topic: Neuling hat ne Frage Projekt Leuchtturm-Karte (Read 5 times) previous topic - next topic

twoll065

Es funktioniert XD XD XD

Du bist ein Held

Danke

jurs


Es funktioniert XD XD XD

Du bist ein Held

Danke


Bitte, gern geschehen!
In lichten Momenten schreibe ich sowas hin und es funktioniert praktisch auf Anhieb.

Zwei kleine Code-Korrekturen habe ich aber trotzdem noch:

Das  "Serial.begin(9600);" ist natürlich überflüssig in einem Programm, das nichts über Serial ausgibt.
Schadet aber auch nicht weiter.

Gewichtiger ist die leicht falsche Abbruchbedingung, es muss in dieser Zeile ">=" statt "=" heißen,
korrekt wäre:
while (onoffCount>0 && inCycleTime-Turmdata[3+Turmdata[2]-onoffCount]>=0)

Dann wird das Timing auch nicht " ca. +/- zwei Millisekunden " sondern "besser als  +/- eine Millisekunde" eingehalten.
Das habe ich gerade mal mit ein paar Timing-Tests festgestellt.

Wenn ich mich nicht verrechnet habe, dauert es 51660 Sekunden, bis sich ein identischer Blinkzyklus wiederholt, man kann also kaum zweimal pro Tag absolut identische Blinkfolgen beobachten.

Der Quellcode ist so gestaltet, dass sich mehr blinkende Türme in einer größeren Karte leicht auch nachträglich einbauen lassen. Und die "Drehzahl" der loop()-Funktion liegt momentan mit 6 Türmen bei weit über 2000 pro Sekunde, so daß jeder Turmstatus in jeder Millisekunde mehr als zweimal aktualisiert wird, da sind also noch Reserven vorhanden.

Viel Spaß beim Basteln Deiner blinkenden Landkarte!

Udo Klein

Eine andere Variante wäre z.B. so:

Code: [Select]
//
//  www.blinkenlight.net
//
//  Copyright 2013 Udo Klein
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program. If not, see http://www.gnu.org/licenses/

#include <MsTimer2.h>

const uint8_t pins = 6;

template <uint8_t led, uint16_t d1, uint16_t d2, uint16_t d3, uint16_t d4,
                      uint16_t d5, uint16_t d6, uint16_t d7, uint16_t d8>
void light_my_fire() {  
   static uint16_t phase = 0;
   
   phase = phase < d1+d2+d3+d4+d5+d6+d7+d8-1? phase+1: 0;

   digitalWrite(led, phase < d1                  ? HIGH:
                     phase < d1+d2               ? LOW:
                     phase < d1+d2+d3            ? HIGH:
                     phase < d1+d2+d3+d4         ? LOW:
                     phase < d1+d2+d3+d4+d5      ? HIGH:
                     phase < d1+d2+d3+d4+d5+d6   ? LOW:
                     phase < d1+d2+d3+d4+d5+d6+d7? HIGH:
                                                   LOW);                                                  
}

void blink() {
   light_my_fire<0,  200, 2800,  200, 2800,  200, 5800,    0,    0>();
   light_my_fire<1, 3000, 3000, 3000, 3000,    0, 8500,    0,    0>();
   light_my_fire<2,  700, 2300,  700, 2300,  700, 2300,  700, 5300>();
   light_my_fire<3, 6000, 6000,    0,    0,    0,    0,    0,    0>();
   light_my_fire<4, 6000, 3000,    0,    0,    0,    0,    0,    0>();
   light_my_fire<5, 6000, 1000,    0,    0,    0,    0,    0,    0>();


}

void setup() {
   for (uint8_t pin=0; pin<pins; ++pin) {
       pinMode(pin, OUTPUT);
   }

   MsTimer2::set(1, blink);
   MsTimer2::start();
}

void loop() {}


Und wenn gewünscht ist, daß die Leuchtfeuer nicht 100% gleich in der Phase laufen, dann einfach bei der letzten Pause immer 1ms draufhauen. Also so:

Code: [Select]
//
//  www.blinkenlight.net
//
//  Copyright 2013 Udo Klein
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program. If not, see http://www.gnu.org/licenses/

#include <MsTimer2.h>

const uint8_t pins = 6;

template <uint8_t led, uint16_t d1, uint16_t d2, uint16_t d3, uint16_t d4,
                      uint16_t d5, uint16_t d6, uint16_t d7, uint16_t d8>
void light_my_fire() {  
   static uint16_t phase = 0;
   
   phase = phase < d1+d2+d3+d4+d5+d6+d7+d8-1? phase+1: 0;

   digitalWrite(led, phase < d1                  ? HIGH:
                     phase < d1+d2               ? LOW:
                     phase < d1+d2+d3            ? HIGH:
                     phase < d1+d2+d3+d4         ? LOW:
                     phase < d1+d2+d3+d4+d5      ? HIGH:
                     phase < d1+d2+d3+d4+d5+d6   ? LOW:
                     phase < d1+d2+d3+d4+d5+d6+d7? HIGH:
                                                   LOW);                                                  
}

void blink() {
   light_my_fire<0,  200, 2800,  200, 2800,  200, 5801,    0,    0>();
   light_my_fire<1, 3000, 3000, 3000, 3000,    0, 8501,    0,    0>();
   light_my_fire<2,  700, 2300,  700, 2300,  700, 2300,  700, 5301>();
   light_my_fire<3, 6000, 6001,    0,    0,    0,    0,    0,    0>();
   light_my_fire<4, 6000, 3001,    0,    0,    0,    0,    0,    0>();
   light_my_fire<5, 6000, 1001,    0,    0,    0,    0,    0,    0>();


}

void setup() {
   for (uint8_t pin=0; pin<pins; ++pin) {
       pinMode(pin, OUTPUT);
   }

   MsTimer2::set(1, blink);
   MsTimer2::start();
}

void loop() {}
Check out my experiments http://blog.blinkenlight.net

jurs


Eine andere Variante wäre z.B. so:


Das habe ich mir gedacht, dass Dein Programm ganz anders wird als meins.
Und vom Mikrosekunden-Timing her noch viel akkurater als meins, das die Timings nur mit millis() macht.

Sehr schöner Programm-Sketch!

sth77


Sehr schöner Programm-Sketch!

Dem möchte ich nur bedingt zustimmen, ich denke nämlich, dass das so manchen Anfänger überfordern wird. Auf jeden Fall ist er sehr effektiv programmiert und aus meiner Sicht eine sehr gute Leistung. :)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Go Up