- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 13

Thema: Arduino automatische Abschaltzeit

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat von i_make_it Beitrag anzeigen
    Wer sagt dir denn, das es nicht möglich ist:

    curmil1
    prevmil1
    toggel1

    curmil2
    prevmil2
    toggel2

    etc. zu nutzen.

    Die Frage ist, wie willst Du es schreiben um es in Funktionen (Methoden) auszulagern? das ist einfach eine Frage des Programmdesigns.
    Aber wenn Du bei dem Beispiel noch nicht darauf schließen konntes, das Du das auch mit mehreren Variabeln machen kannst, würde ich Dir für den Moment von Methoden abraten.

    Denn wenn Du die selbe Methode aufrufst um damit die Zeiten von z.B. 10 Pins zu verwalten, mußst Du ja auch die 10 Zustände und 10 Zeiten sauber getrennt speichern können.
    Das setzt vorraus, das Du mindestns erkennen kannst, das toggelstate und prevmicros auch mit einem Zähler als x verschiedene Variablen vorkommen kann oder das man ein Toggelstate Array und ein prevmicros array erstellt und da dann immer nur das jeweils passende Feld setzt, auswertet, löscht.
    Mein Beispiel ist halt erst mal ein Hinweis in die Richtung "Freilaufender Zähler mit millis()".
    Wie umfangreich Du das programmieren willst hängt ja von Dir ab.

    Du kannst es auch ganz elegant machen und mit Timerinterrupts arbeiten, dann hast Du für jeden IRQ eine ISR, was ja dann auch aus der Loop ausgelagerte Funktionen sind.
    Die sind dann sogar ganz präzise. die Varinte mit milis() stellt ja nur Sicher, das mindestens die Zeit und maximal die Zeit plus einmal der komplette Programmdurchlauf vergehen.
    Leider ist es so das noch nicht mal die erste Variante zu 100% funktioniert. Der Kanal wird zwar angeschalten aber Nicht wieder aus.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Bei deinem Code defienierst Du ein Array mit 24 Werten, aber ohne dem Array mitzugeben das auch 24 Speicherplätze haben soll.
    Ist unschöner Code. Wurde das nicht beim Compilieren angemeckert?
    wenn du also 24 verschiedene Kanäle hast, warum hast Du dann nur einmal State und auch nur einmal preMills ?
    Wann enthält State den Status von welchem der 24 Kanäle und wann enthällt preMills die Startzeit von welchem Kanal?

    Anzahl2 ist ja der Index mit dem du alles was in
    if(buttonState == Anzahl[Anzahl2])
    drin ist zu 24 verschiedenen Programmteilen machst.
    nur kannst Du mit State nicht 24 Verscheidene Zustände gleichzeitig speichern State[Anzahl2] könnte das.
    Genau das Selbe bei preMills: --> preMills[Anzahl2].

    Gehe Deinen Code erst mal durch und führe ihn auf Papier aus. Schreib Dir dazu immer auf welche Variable welchen Wert hat.
    Dann fallen Dir solche Sachen sofort auf. denn die eine Variabel wird halt ständig neu befüllt und liefert dann für index 1 den Wert zurück der ihr vorher bei index 24 eingeschrieben wurde und schon lange nicht mehr den Wert der beim letzten Durchlauf von Index1 geschrieben wurde.

  3. #3
    HaWe
    Gast
    Zitat Zitat von i_make_it Beitrag anzeigen
    Bei deinem Code defienierst Du ein Array mit 24 Werten, aber ohne dem Array mitzugeben das auch 24 Speicherplätze haben soll.
    Ist unschöner Code. Wurde das nicht beim Compilieren angemeckert?
    "unschöner Code"?
    auf was beziehst du dich?
    auf dies hier:
    int Anzahl[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; //Kanäle die geschalten werden dürfen



    falls ja: dieser Teil ist völlig korrekt, super schön, entspricht vollständig den C++(04/11) und C99 specs und da hat der Compiler absolut überhaupt nichts dran rumzumeckern

    OT, ps, allerdings: "geschaltet werden dürfen, nicht: geschalten...

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Ich habe auch geschrieben unschön nicht falsch.

    Unschön deshalb, weil man mit 'int Anzahl[24] = {...' sofort die Größe des Array sieht auch wenn da mal andere Werte stehen als eine monoton steigende, ununterbrochene Folge aus natürlichen Zahlen.
    Wird hilfreich wenn man mal nach 2-3 Jahren seinen eigenen Code versucht zu verstehen oder was verändern will.
    Da ich schon seit über 3 Jahrzehnten programmier, bin ich über so Schwächen selbst schon oft genug gestolpert.
    Irgendwann kommt der Punkt wo man seinem jüngeren ich dankbar ist für jeden schnell zu verstehenden Code den man hinterlassen hat.

    Da auch kein Hinweis vorhanden ist das es sich um ein dynamisches Array handelt, kann man das halt für die Lesbarkeit machen.
    Geändert von i_make_it (29.06.2017 um 17:51 Uhr)

  5. #5
    HaWe
    Gast
    Zitat Zitat von i_make_it Beitrag anzeigen
    Ich habe auch geschrieben unschön nicht falsch.

    Unschön deshalb, weil man mit 'int c = {...' sofort die Größe des Array sieht auch wenn da mal andere Werte stehen als eine monoton steigende, ununterbrochene Folge aus natürlichen Zahlen.
    Wird hilfreich wenn man mal nach 2-3 Jahren seinen eigenen Code versucht zu verstehen oder was verändern will.
    Da ich schon seit über 3 Jahrzehnten programmier, bin ich über so Schwächen selbst schon oft genug gestolpert.
    Irgendwann kommt der Punkt wo man seinem jüngeren ich dankbar ist für jeden schnell zu verstehenden Code den man hinterlassen hat.

    Da auch kein Hinweis vorhanden ist das es sich um ein dynamisches Array handelt, kann man das halt für die Lesbarkeit machen.
    nein, sorry, der Code ist weder unschön, noch hat der Compiler Grund zu meckern:

    Es ist per
    int Anzahl[] = // ...
    der einzige (!) mögliche (!) Weg, diesen 24er array direkt bei der Definition zu initialisieren.
    Definiert man ihn per
    int Anzahl[24] //...
    kann man ihn anschließend nicht mehr per
    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
    initialisieren.
    In diesem Falle legt C also eindeutig die einzig mögliche und richtige Syntax fest, die Frage nach schön oder nicht stellt sich also gar nicht.
    Und ob der Code Enkel-sicher ist, ist sowieso hier nicht wichtig - er muss zunächst einmal überhaupt nur einfach mal funktionieren....

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von HaWe Beitrag anzeigen
    Definiert man ihn per
    int Anzahl[24] //...
    kann man ihn anschließend nicht mehr per
    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
    initialisieren.
    Hm, ich weis jetzt nicht von welcher Programmiersprache Du schreibst, aber ich bin grade bei ISO IEC 14882.
    Weder mein Borland noch Arduino haben damit ein Problem, das ich ein statisches Array genau so definiere und initialisiere.

    Wenn Das bei Dir nicht möglich ist, und es für Dich der einzige Weg ist es wie ein dynamisches Array zu definieren, würde ich an deiner Stelle mal Deine Entwicklungsumgebung überprüfen.
    Und falls Du kein Buch über C++ hast, es gibt auch Webseiten die das erklären.
    http://www.cplusplus.com/doc/tutorial/arrays/
    Ich habe mal bei meinem Borland "strict" mal abgestellt. dann wird auch 'int Anzahl[] = {.....}' nicht an gemeckert.
    Bei Arduino hatte ich es tatsächlich so noch nicht probiert, da mein erstes C auf µC's das MIT interactive C war und ich seit dem Array so definiere.

    Dynamische Array auf einen µC mache ich halt aus 'Tradition' nicht. Liegt vieleicht daran das ich heute noch Speicherplatz als kostbar betrachte.
    Bin halt auch noch gewohnt ganze Programme, Stack und Variablen Bereich mit 4K RAM hinzubekommen.

    Und bei 'int Anzahl[24]' sehe ich halt direkt 2Byte (für int) mal 24 gleich 48 Byte Speicherbedarf.
    Und muß nicht erst zeitraubend die Kommas abzählen und dann plus 1 um die Anzahl der Felder zu erhalten.

    Aber wie gesagt ich empfinde es als unschönen Code, funktionieren tut es.

    Zitat Zitat von HaWe Beitrag anzeigen
    Es ist per
    int Anzahl[] = // ...
    der einzige (!) mögliche (!) Weg, diesen 24er array direkt bei der Definition zu initialisieren.
    Diese Aussage, ist aber schlichtweg falsch (Zumindest für eine ISO IEC 14882 konforme C++ Implemtierung. Und was anderes ist ja kein C++ sondern eine andere Sprache).
    Es ist einer der möglichen Wege.
    Geändert von i_make_it (30.06.2017 um 06:57 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von i_make_it Beitrag anzeigen
    Diese Aussage, ist aber schlichtweg falsch (Zumindest für eine ISO IEC 14882 konforme C++ Implemtierung. Und was anderes ist ja kein C++ sondern eine andere Sprache).
    Da muss ich HaWe jetzt aber beispringen, zu diesen C++ Zeiten war ich an der Uni.

    Ja, die Initialisierung von Array in der Form
    Code:
    int feld[] = { 1, 2, 3 };
    gibt es schon seit Anfang an in C++, weil es sie schon seit dieser Zeit in C gab.

    Und ja, es war damals, also auch in den ersten ISO Normen, die einzige Möglichkeit ein C Array direkt bei der Definition zu initialisieren. Und zwar nur C Array keine Vektoren oder so.


    Und ja, es war schon damals guter Stil, die Größe des Feldes nicht extra in die eckigen Klammern zu schreiben.

    Daraus, und das vermischt HaWe etwas, wurde die "Uniform Initialisation" in C++11, neuer Stil wäre also eher
    Code:
    array<int> feld = { 1, 2, 3 }
    
    auto n = feld.size();
    Hier wird auch bei n nicht mal der Typ angegeben, das nennt sich AAA-Stil (almost always auto), wird von einigen Experten empfohlen (Scott Meyers, Herb Sutter, ...), ist aber nicht unumstritten.

    Man kann heute übrigens, in aktuellem C++, in der Arduino IDE nur bei den Teensy Boards, alles mit geschweiften Klammern initialisieren
    Code:
    int a = 1;
    
    int b{2};
    Warum das in der ISO Norm u.a. geändert wurde, kann man hier lesen
    https://en.wikipedia.org/wiki/Most_vexing_parse
    Geändert von Mxt (05.07.2017 um 13:10 Uhr) Grund: Verschrieben

  8. #8
    Zitat Zitat von i_make_it Beitrag anzeigen
    Bei deinem Code defienierst Du ein Array mit 24 Werten, aber ohne dem Array mitzugeben das auch 24 Speicherplätze haben soll.
    Ist unschöner Code. Wurde das nicht beim Compilieren angemeckert?
    wenn du also 24 verschiedene Kanäle hast, warum hast Du dann nur einmal State und auch nur einmal preMills ?
    Wann enthält State den Status von welchem der 24 Kanäle und wann enthällt preMills die Startzeit von welchem Kanal?

    Anzahl2 ist ja der Index mit dem du alles was in
    if(buttonState == Anzahl[Anzahl2])
    drin ist zu 24 verschiedenen Programmteilen machst.
    nur kannst Du mit State nicht 24 Verscheidene Zustände gleichzeitig speichern State[Anzahl2] könnte das.
    Genau das Selbe bei preMills: --> preMills[Anzahl2].

    Gehe Deinen Code erst mal durch und führe ihn auf Papier aus. Schreib Dir dazu immer auf welche Variable welchen Wert hat.
    Dann fallen Dir solche Sachen sofort auf. denn die eine Variabel wird halt ständig neu befüllt und liefert dann für index 1 den Wert zurück der ihr vorher bei index 24 eingeschrieben wurde und schon lange nicht mehr den Wert der beim letzten Durchlauf von Index1 geschrieben wurde.
    Also mir war es erstmal wichtig das es funktioniert! Schönmachen kann man es danach immer noch... Habe es jetzt komplett fertig aber anders gelöst. Falls es dich interessiert:
    Code:
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Conceptinetics.h>
    
    DMX_Master        dmx_master ( 24 , 2 );
    
    RF24 radio(7, 8); // CNS, CE
    const byte address[6] = "00001";
    long kanal;
    #define ANZAHL_KANAL 24
    uint32_t anschaltzeit[ANZAHL_KANAL];
    int Anzahl[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
    const uint32_t OnTime = 300;
    
    
    void setup() {
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      dmx_master.enable ();
      radio.begin();
      radio.openReadingPipe(0, address);
      radio.setPALevel(RF24_PA_MAX);
      radio.startListening();
    }
    
    void loop() {
      checkKanal();  
      if (radio.available()){
        radio.read(&kanal, sizeof(kanal));
          if(kanal == Anzahl[kanal-1]) {   
            kanalEinschalten(kanal);
          }
      }
    }
    
    void kanalEinschalten(byte nummer) { // 1 bis 24
       anschaltzeit[nummer-1] = millis();
       digitalWrite(nummer,HIGH);
       dmx_master.setChannelValue (nummer , 255);
    }
    void kanalAusschalten(byte nummer) { // 1 bis 24
       anschaltzeit[nummer-1] = 0;
       digitalWrite(nummer,LOW);
       dmx_master.setChannelValue (nummer , 0);
    }
    void checkKanal() {
      uint32_t aktMillis = millis();
      for(byte i=0; i<ANZAHL_KANAL; i++) {
        if (anschaltzeit[i] != 0 && aktMillis - anschaltzeit[i] >= OnTime) kanalAusschalten(i+1); 
      }
    }
    Ist zwar noch nicht ganz schön aber macht was es soll.

    Trotzdem nochmal vielen dank!

Ähnliche Themen

  1. Automatische Stromversorgung
    Von AndreasMüler im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 14.08.2010, 13:36
  2. automatische Heizungsreglung
    Von daniel.weber im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 27.03.2008, 06:56
  3. automatische Toröffnung?
    Von spec im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 16.12.2007, 08:44
  4. automatische Singalamplitudenanpassung
    Von hacker im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 23.08.2006, 14:37
  5. Automatische Sensorerkennung
    Von Tomili im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 07.04.2006, 21:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress