- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: Ein Drehregler und ein Arduino Nano

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    na wer sagt's denn...
    https://www.conrad.de/de/drehgeber-1...4339639432!!!g!!

    Trotzdem müsstest du eigtl auch einen Artikel-Link von der Händler-Seite haben, denke ich, irgendwo musst du ihn schließlich her haben....

    Aber dann lies dir jetzt am besten mal die Tutorials durch!

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Hilft dir Aliexpress? Es müsste ein KY-040 sein. Habe dazu auch schon einige Tuts durch und da wird es immer ähnlich beschrieben, wie ich es gemacht habe. Ich nehme mal an, in meinem Sketch stört das Display. ALso stören im Sinne von, die Ansteuerung des Displays frisst zu viel Zeit und deshalb klappt es nicht wirklich.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Wir dürfen nur auf EINE Flanke reagieren, sonst geht das schief.
    Entweder nur auf die Aufsteigende oder nur die Fallende Flanke.
    Da die Pins über Pullupwiderstände an Plus liegen, würde ich die fallende Flanke auswerten,
    also wenn der Pin A von High nach Low geht.
    Ist der Pin A also auf High bedeutet dies Ruhezustand.
    Wir benötigen noch ein Flag um den Zustand festzuhalten bzw. um festzuhalten ob wir die Flanke
    schon ausgewertet haben, damit auch wirklich nur ein Puls ausgewertet wird.

    Doch nun zum Code, den ich nicht testen kann, aber so in etwa sollte das gehen:
    Code:
    int Flag;
    
    void ui()
    { if (digitalRead(A)==1)  // wenn die Leitung High ist, haben wir die Ruhestellung
      {
        Flag=0;  // Ruhestellung  
        return;  // nix weiter machen
      } 
    
      // hier kommen wir nun nur an, wenn der Pin A Low wird:
      if (Flag == 1) return;   // wenn das Flag schon gesetzt war, machen wir aber keine Auswertung mehr
    
      Flag = 1;                // ansonsten setzen wir nun das Flag und führen nur einmal die Auswertung von Pin B durch
    
      if (digitalRead(B) volt+=0.05;
                    else volt-=0.05;
    }
    
    // Info: Das Flag wird jetzt erst wieder gelöscht, wenn die Datenleitung A auf High (also in den Ruhezustand) geht.
    // Wichtig: Die Variable Flag muss GLOBAL sein, also ausserhalb der Funktion definiert werden.
    Das ist nur mal zum Testen, ich hoffe das hilft Dir weiter.

    Nanu, das Datenblatt hab ich eben erst gesehen, funktioniert der etwa anders.....
    jetzt bin ich mir da nicht mehr sicher......
    Geändert von Siro (06.07.2018 um 22:26 Uhr)

  4. #4
    HaWe
    Gast
    Zitat Zitat von hirnfrei Beitrag anzeigen
    Hilft dir Aliexpress? Es müsste ein KY-040 sein. Habe dazu auch schon einige Tuts durch und da wird es immer ähnlich beschrieben, wie ich es gemacht habe. Ich nehme mal an, in meinem Sketch stört das Display. ALso stören im Sinne von, die Ansteuerung des Displays frisst zu viel Zeit und deshalb klappt es nicht wirklich.
    ja, das funktioniert identisch. Wie gesagt, mach mal ein paar Tutorials, das ist besser als Code zu kopieren ohne es richtig verstanden zu haben.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Leider tut es das nicht Siro .

    Ich nehme aber mal an, es liegt an dem Rest von meinem Sketch. Diese Variante funktioniert zum Beispiel, auch wenn sie immer gleich 2 Schritte hochzählt:

    Code:
    int c = 0;
    int State;
    
    void setup() 
    {
      Serial.begin(9600);
    
      pinMode(3, INPUT);
      pinMode(4, INPUT);
    }
    
    void loop() 
    {
      int aState = digitalRead(3);
    
      if(State != aState)
      {  
         if(digitalRead(4) != aState)
         {
          c++;
         }
         else c--;
      }
    
      State = aState;
      
      Serial.println(c);
    }
    Da zählt er problemlos hoch und runter. Benutze ich aber folgenden Sketch, wobei ich an dem Aufbau der Hardware nichts ändere, funktioniert es manchmal abwärts, fast gar nicht aufwärts und gelegentlich zählt er auch wieder hoch, wenn er runtergezählt hat. Vielleicht kannst du darin ja ein Problem erkennen.

    Code:
    #include <Arduino.h>
    #include <U8g2lib.h>
    
    #ifdef U8X8_HAVE_HW_SPI
    #include <SPI.h>
    #endif
    #ifdef U8X8_HAVE_HW_I2C
    #include <Wire.h>
    #endif
    
    U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
    
    #define A 3
    #define B 4
    #define FIRE 2
    
    float volt = 7.4;
    float maximum = 8.4;
    float aktuell = 8.4;
    
    int Flag;
    int toInterval = 5000;
    
    long timeout = toInterval;
    long time = 0;
    
    void setup(void) 
    {
      u8g2.begin();
    
      pinMode(A, INPUT);
      pinMode(B, INPUT);
      pinMode(FIRE, INPUT);
    }
    
    void loop(void) 
    {
      time = millis();
      ui();  
    
      u8g2.clearBuffer();
    
      //  akkustand();
    
      if(time < timeout)
      {
        u8g2.setFont(u8g2_font_crox3h_tf);
        u8g2.setFontRefHeightExtendedText();
        u8g2.setDrawColor(1);
        u8g2.setFontPosTop();
        u8g2.setFontDirection(0);
      
        u8g2.drawStr(18, 0, "K2-Box V 0.3");
        u8g2.drawLine(0, 18, 128, 18);
        u8g2.drawLine(0, 50, 128, 50);
      
        power();
      
      //  debug();
      }
    
      u8g2.sendBuffer();
    }
    
    void power()
    {
      String p = String(volt) + "V";
    
      u8g2.setFont(u8g2_font_ncenR18_tr);
    
      u8g2.drawStr(30, 25, p.c_str());
    }
    
    void akkustand()
    {
      float proz = aktuell * 100 / maximum;
    
      int stand = 128 - round(128 * proz / 100);
    
      u8g2.drawBox(stand, 50, 128, 64);
    }
      
    void debug()
    {
      u8g2.setFont(u8g2_font_t0_11_tf);
    
      String ausgabe;
    
      ausgabe = String(digitalRead(A)) + " " + String(digitalRead(FIRE)) + " " + String(digitalRead(B));
    
      u8g2.drawStr(0, 52, ausgabe.c_str());
    
      String check;
    
      if(digitalRead(A) == LOW) check = "-";
      if(digitalRead(B) == LOW) check = "+";
     
      u8g2.drawStr(50, 52, check.c_str());
    }
    
    void ui()
    {
      if(digitalRead(A) == HIGH)
      {
        Flag = LOW;
        return;
      }
    
      if(Flag == HIGH) return;
    
      Flag= HIGH;
    
      if(digitalRead(B)) volt += 0.05;
      else volt -= 0.05;
    }
    Das Schlimme daran ist, das komplette Projekt steht und fällt mit diesem Regler...

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Das große Problem ist, dass Dir vermutich Signale abhanden kommen, da in deinem Programm doch noch "reichlich" anderer Code ausgeführt wird.
    Alleine die Floating Point Berechnungen auf dem kleinen 8 Bit Controller fressen schon viel Zeit.
    dann sehe ich da Grafikfunktionen. Das schafft der Controller nicht mit dieser Programmiertechnik,
    da kommt man eigentlich nicht drumherum mit Interrupts für den Impulsgeber zu arbeiten.
    Du könntest Dir eventuell noch behelfen indem Du so oft wie möglich deine ui Funktion aufrufst,
    quasi nach jeder anderen Softwarezeile, sieht kacke aus und das macht man eigentlich auch nicht, aber Versuchs mal.

    Code:
    void loop(void) 
    {
      time = millis();
      ui();  
    
      u8g2.clearBuffer();
      ui();  
    
      //  akkustand();
    
      if(time < timeout)
      {
        u8g2.setFont(u8g2_font_crox3h_tf);
      ui();  
        u8g2.setFontRefHeightExtendedText();
      ui();  
        u8g2.setDrawColor(1);
      ui();  
        u8g2.setFontPosTop();
      ui();  
        u8g2.setFontDirection(0);
      ui();    
        u8g2.drawStr(18, 0, "K2-Box V 0.3");
      ui();  
        u8g2.drawLine(0, 18, 128, 18);
      ui();  
        u8g2.drawLine(0, 50, 128, 50);
      ui();    
        power();
        ui();  
      //  debug();
      }

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Irgendwie habe ich mir das schon gedacht. Nun, dann sollte ich mir das mit den Interrupts mal genauer anschauen. Kann ja nicht schaden wenn man das versteht. Wenn nicht, mit den vielen ui() würde es mit Sicherheit funktionieren. Sieht aber tatsächlich sehr unschön aus. Wenn das alles nicht hilft, werde ich wohl abspecken müssen. Gibt noch andere, harmloserer Libs, um das Display anzusteuern. Sieht dann aber nicht mehr so schön aus, also die Anzeige. Aber besser als wenn es gar nicht funktioniert.

    - - - Aktualisiert - - -

    Jetzt bin ich etwas erschüttert! Nach 5 Minuten lesen musste ich feststellen, die Interrupts sind ja gar keine Herausforderung! Jetzt habe ich meinen Sketch auf Interrupt umgestellt und man glaubt es kaum, es funktioniert perfekt!

    Vielen, vielen Dank für deine Hilfe!

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 08.01.2018, 17:30
  2. Verkaufe Arduino Nano V3.0 mit Atmega328
    Von razer6 im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 08.05.2017, 16:25
  3. Arduino Nano mit ESP-201
    Von hirnfrei im Forum Arduino -Plattform
    Antworten: 23
    Letzter Beitrag: 21.11.2016, 21:05
  4. Roboter mit ARDUINO NANO
    Von stochri im Forum Arduino -Plattform
    Antworten: 13
    Letzter Beitrag: 23.10.2015, 21:47
  5. Arduino Nano mit Uno aus/einschalten
    Von SoulRaiZor im Forum Arduino -Plattform
    Antworten: 8
    Letzter Beitrag: 24.05.2015, 10:45

Berechtigungen

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

Solar Speicher und Akkus Tests