Wątek przeniesiony 2022-06-03 08:54 z C/C++ przez Patryk27.

Esp32 Timer - konstrukcja klasy

0

Witam mam dwa kody. Jeden działa poprawnie (ten prosty) a ten z klasą robi co chce (raz miga raz nie , miga jak chce).
Na c++ za bardzo się nie znam i nie bardzo wiem jak tą funkcjonalność poprawnie zaimplementować do klasy.
kod działąkjący

 #include <74HC595.h>
  #include <Arduino.h>
 // #include "FS.h"
// #include "SD.h"
// #include "SPI.h"
#include <Ticker.h>
CHIP_74HC595 chip;
 Ticker timerRelayLed;
 Ticker timerWifi;
Ticker timerSD;
Ticker timerReady;
Ticker timerError;
uint8_t chipPinArray [20] = {7,6,5,4,3,2,1,0,16,21,22,23,17,18,19,20,8,13,14,15};
#define l1  chipPinArray[0]
//... tu jest cala tablica to jest malo wazne


 void  blinkWifi(){
static boolean c = 0;
if(c==0){chip.switchPin(d2,ON); c=1;}else{chip.switchPin(d2,OFF); c=0; }

    }
  void blinkRelay(){
static uint8_t a = 8;
static boolean c = 0;

  if(c==0){chip.switchPin(chipPinArray[a],ON); c=1;}else{chip.switchPin(chipPinArray[a],OFF); c=0;a++;if(a>15){a=8;}; }
  
    }
    void blinkSD(){
static int c = 0;
 if(c==0){chip.switchPin(d4,ON); c=1;}else{chip.switchPin(d4,OFF); c=0; }

    }  
    void blinkError(){
static int c = 0;
 if(c==0){chip.switchPin(d1,ON); c=1;}else{chip.switchPin(d1,OFF); c=0; }

    } 
    void blinkReady(){
static int c = 0;
 if(c==0){chip.switchPin(d3,ON); c=1;}else{chip.switchPin(d3,OFF); c=0; }

    } 
      
void setup() {
   chip.init(27,26,25,33,3);  
 timerRelayLed.attach(0.1, blinkRelay);
  timerWifi.attach(0.1, blinkWifi);
 timerSD.attach(0.1, blinkSD);
timerError.attach(0.1, blinkError);
timerReady.attach(0.1, blinkReady);
}

void loop() {

}

kod do poprawy

#include <74HC595.h>
#include <Ticker.h>
CHIP_74HC595 chip;
 
uint8_t chipPinArray [20] = {7,6,5,4,3,2,1,0,16,21,22,23,17,18,19,20,8,13,14,15};
#define l1  chipPinArray[0]
//... tu jest cala tablica to jest malo wazne

 class Blinker : Ticker {
  Ticker t;
  public:
  void on(){chip.switchPin(led,ON);}
  void off(){chip.switchPin(led,OFF);}
  void blinkStart(float time){t.attach(time, +[](Blinker* f){f->blink();},this); }
  Blinker* blinkStop(){t.detach();return this; }
  Blinker(uint8_t l){led = l;}
  Blinker(uint8_t a[]){arr = a;}
  private:
   uint8_t led ;
   uint8_t* arr;
  void  blink(){static boolean c = 0;if(c==0){chip.switchPin(led,ON); c=1;}else{chip.switchPin(led,OFF); c=0; }return;}
  };//end class

 Blinker errorLed(d1); 
 Blinker wifiLed(d2);
 Blinker readyLed(d3);
 Blinker kartaLed(d4);



void setup() {
   chip.init(27,26,25,33,3);  
errorLed.blinkStart(0.1);
wifiLed.blinkStart(0.1);
readyLed.blinkStart(0.1);
kartaLed.blinkStart(0.1);
 
//w tym przypadku diody wogole nie migaja

}

void loop() {
//delay(15000);
// wifiLed.blinkStop()->off();
}
1

W metodzie blink masz statyczną zmienną w której trzymasz stan wyjścia. Zrób z niej pole klasy bo teraz to jest ona wspólna dla wszystkich instancji.

I przy okazji - sformatuj ten kod bo to co masz to porażka.

0

Dzięki.
Co do kodu to ciężko coś robić w Arduino ide , problem jest taki że po formatowaniu zdarza się że wywala błędy. (Znany urok tego softu).
Praktyka pracy w tym dziadostwie nauczyły mnie aby używać jak najmniej białych znaków.

0

Następnym razem wrzucę do formatowania online zanim wyśle na stronę. Używam visual studio code do js i php a c++ rzadko używam i nie bardzo mi się chciało ustawiać vsc

0

Przesyłam poprawiony kod .Działa jakby co.

class Blinker {
   public:
      Blinker * blinkStop() {
         t.detach();
         return this;
      }
   Blinker(uint8_t l) {
      led = l;
   }
   Blinker(uint8_t a[]) {
      arr = a;
   }
   void on() {
      chip.switchPin(led, ON);
   }
   void off() {
      chip.switchPin(led, OFF);
   }

   void blinkStart(float time) {
      t.attach(time, blinker_trigger, this);
   }

   private:
   uint8_t led;
   uint8_t * arr;
   Ticker t;

   void blink() {
      static boolean c = 0;
      if (c == 0) {
         chip.switchPin(led, ON);
         c = 1;
      } else {
         chip.switchPin(led, OFF);
         c = 0;
      }
      return;
   }

   static void blinker_trigger(Blinker * o) {
      o -> blink();
   }
};
1

Przecież nic nie zmieniłeś. Dalej jest "static boolean c = 0;" i dalej nie powinno działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1