Skocz do zawartości

esp32 przerwanie timer


Pomocna odpowiedź

Napisano (edytowany)

witam....widzi ktos tutaj jakis blad? bo patrze od godziny  i sie nadziwic nie koge ze nie dziala...🤨

#include <Preferences.h>
#include "SPI.h"
#include "TFT_eSPI.h"
#include <ESP32Encoder.h>
#include <BlinkPin.h>


TFT_eSPI tft = TFT_eSPI();  // Invoke library, pins defined in User_Setup.h




BlinkPin buzz(LED_BUILTIN);  //aktywuje dany pin jako OUTPUT


hw_timer_t *My_timer = NULL;

Preferences prefs;

ESP32Encoder encode;

#define TLO                    0x10ab
#define COLOR_RAMKI            0xed61
#define COLOR_WYPELNIENIE      0x0c66
#define COLOR_WYPELNIEINE_NEG  0xf800
#define COLOR_DANYCH           0xff81
#define COLOR_TEMP           0x8873
#define COLOR_TEMP_NEG           0xf800



#define pin_ssr     14          // LED_BUILTIN
#define INTERVAL_IMPULS 300
#define PIN_ISR  13








byte licznik_kopia;
bool tryb = 0;
int kopia_dane;
int temp;

int przerwa1;
byte wybor_tryb;

bool stan_ssr;
int licznik = 1;
uint32_t moc;
int opoznienie;
int procenty = 0;
int temp_min = 20;
int temp_max = 100;
int fun_min = 1;
int fun_max = 99;
bool stan = 1;
bool stan1 = 0;
bool lc = 1;
bool flaga;
bool lcd = 1;
bool guzik;
String a = "";
String q = "";

void zmienne();
void encoder_tryb(int);
void encoder_dane(int);
void encoder(int&, int, int, bool);
void guzik_enkoder();
void zapisz_eprom();
void odczytaj_eprom();
void IRAM_ATTR przerwanie();
void IRAM_ATTR timerr();
void temperatura();
void IRAM_ATTR da();

void setup() {
  tft.init();
  tft.invertDisplay(0);
  tft.setRotation(0);
  tft.fillScreen(TLO);


  prefs.begin("data");

  encode.attachHalfQuad ( 17, 16 );

  Serial.begin(115200);

  pinMode(PIN_ISR, INPUT_PULLUP);
  pinMode(pin_ssr, OUTPUT);


  digitalWrite(pin_ssr, LOW);


  attachInterrupt(PIN_ISR, przerwanie, RISING);

  My_timer = timerBegin(0, 80, true);
  timerAttachInterrupt(My_timer, &timerr, true);
  timerAlarmEnable(My_timer);




  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);

  tft.setTextColor(COLOR_DANYCH);
  tft.setTextSize(2);
  tft.setCursor(0, (128 / 3) - 22);
  tft.println("temp");



  odczytaj_eprom();

  zmienne();

  //pinMode(13, OUTPUT);
  //digitalWrite(13, HIGH);

}


void loop(void) {

  buzz.update();    //ciagle sprawdzanie czasu i ilosci cykli (musi byc ciagle sprawdzane! bez delay()!!!)
  static uint32_t last_temp = 0;
  if (q == "xxxxxxxxxxxxxxxxxx")  {
  Serial.println(a);
    Serial.println(q);
    q == "";

  }
  if (millis() - last_temp > 500UL) {
    temperatura();
    last_temp = millis();
    procenty = map(temp, temp_min, temp_max, 0, 100);
    int x = map(fun_min, 0, 99, 10000, 5);
    int xx = map(fun_max, 0, 99, 10000, 5);
    moc = map(procenty, 0, 100, x, xx);
    Serial.println(moc);
    tft.fillRoundRect(65, 5 , 60, 35  , 5, COLOR_TEMP);
    tft.setCursor(75, (128 / 3) - 22);
    tft.println(temp);
  }

  guzik_enkoder();


  switch (tryb)  {
    case 0:
      encoder(licznik, 1, 5, 1);
      if (licznik != licznik_kopia) {
        lcd = 1;
        licznik_kopia = licznik;
       // Serial.println(licznik);
      }
      if ( licznik == 1) {
        if (lcd) {
          tft.fillRect(0, 40 , 128, 128, TLO);
          tft.fillRoundRect(0, 46 , 60, 35  , 5, COLOR_WYPELNIENIE);
          zmienne();
          lcd = 0;
        }

      } else if ( licznik == 2) {
        if (lcd) {
          tft.fillRect(0, 40 , 128, 128, TLO);
          tft.fillRoundRect(65, 46 , 60, 35  , 5, COLOR_WYPELNIENIE);
          zmienne();
          lcd = 0;
        }
      } else if ( licznik == 3) {
        if (lcd) {
          tft.fillRect(0, 40 , 128, 128, TLO);
          tft.fillRoundRect(0, 110 , 60, 35 , 5, COLOR_WYPELNIENIE);
          zmienne();
          lcd = 0;
        }

      } else if ( licznik == 4) {
        if (lcd) {
          tft.fillRect(0, 40 , 128, 128, TLO);
          tft.fillRoundRect(65, 110 , 60, 35 , 5, COLOR_WYPELNIENIE);
          zmienne();
          lcd = 0;
        }

      }

        if (guzik == 1) {
          tryb = 1;
          guzik = 0;
        }
        break;

      case 1:
        if (licznik == 1) {
          encoder(temp_min, 1, 150, 0);
          if (flaga) {
            tft.fillRect(0, 40 , 128, 128, TLO);
            tft.fillRoundRect(0, 46 , 60, 35  , 5, COLOR_WYPELNIEINE_NEG);
            zmienne();
          }
        } else if (licznik == 2) {
          encoder(temp_max, 1, 150, 0);
          if (flaga) {

            tft.fillRect(0, 40 , 128, 128, TLO);
            tft.fillRoundRect(65, 46 , 60, 35, 5, COLOR_WYPELNIEINE_NEG);
            zmienne();
          }
        } else if (licznik == 3) {
          encoder(fun_min, 1, 100, 0);
          if (flaga) {

           tft.fillRect(0, 40 , 128, 128, TLO);
            tft.fillRoundRect(0, 110 , 60, 35 , 5, COLOR_WYPELNIEINE_NEG);
            zmienne();
          }
        } else if (licznik == 4) {
          encoder(fun_max, 1, 100, 0);
          if (flaga) {

          tft.fillRect(0, 40 , 128, 128, TLO);
            tft.fillRoundRect(65, 110 , 60, 35 , 5, COLOR_WYPELNIEINE_NEG);
            zmienne();
          }

        }
        flaga = 0;
      
        if (guzik == 1) {
          tryb = 0;
          guzik = 0;
        }
        break;
      


  }
}




  void encoder(int & dane, int zwieksz, int ile, int x) {
    long i = encode.getCount() / 2;
    if ( i > 0 ) {

      flaga = 1;
      lcd = 1;
      dane += zwieksz;
      // buzz.blink(1, 50, 0);  //wystartowanie pinu..ilosc cykli, czas HIGH, czas LOW    dane += zwieksz;
      encode.setCount (0);
      if (dane == ile) {
        dane = x;

      }
      zapisz_eprom();
      Serial.println(dane);
    }

    if ( i < 0 ) {

      flaga = 1;
      lcd = 1;
      dane -= zwieksz;
      encode.setCount (0);
      if (dane < x) {
        dane = ile - zwieksz;
      }
      zapisz_eprom();
    }
  }


  void zmienne() {
    tft.setCursor(16, 58);
    tft.println(temp_min);

    tft.setCursor(80, 58);
    tft.println(temp_max);

    tft.setCursor(16, 123);
    tft.println(fun_min);

    tft.setCursor(80, 123);
    tft.println(fun_max);



  }

  void guzik_enkoder() {

    if (digitalRead(5) == LOW) {
      guzik = 1;
      delay(500);
      flaga = 1;
      lcd = 1;
    }
  }



  void zapisz_eprom() {
    prefs.putInt("licznik", licznik);
    prefs.putInt("temp_min", temp_min);
    prefs.putInt("temp_max", temp_max);
    prefs.putInt("fun_min", fun_min);
    prefs.putInt("fun_max", fun_max);


  }

  void odczytaj_eprom() {
    licznik = prefs.getInt("licznik", 0);
    temp_min = prefs.getInt("temp_min", 0);
    temp_max = prefs.getInt("temp_max", 0);
    fun_min = prefs.getInt("fun_min", 0);
    fun_max = prefs.getInt("fun_max", 0);
  }



  void temperatura() {

    static float kopia_temp = 0;
    float sample = analogRead(35);
    temp = 1. / (log(1. / (3300 / sample - 1.)) / 3950.0 + 1.0 / 298.15) - 273.15;

    Serial.println(temp);



  }

  void IRAM_ATTR przerwanie() {

    if (temp < temp_max && temp > temp_min) {
      timerAlarmWrite(My_timer, moc, true);
      timerWrite(My_timer, 0);
      timerAlarmEnable(My_timer); //Just Enable
      stan_ssr == 1;
      a = "moc";
     
    } else if (temp > temp_max) {
      digitalWrite(pin_ssr, HIGH);
            timerAlarmDisable(My_timer);
            a = "on";

    } else if (temp < temp_min) {
      digitalWrite(pin_ssr, LOW);
           timerAlarmDisable(My_timer);
           a = "off";

    }


  }


  void IRAM_ATTR timerr() {
    if (stan_ssr == 1) {
      digitalWrite(pin_ssr, HIGH);
      timerAlarmWrite(My_timer, INTERVAL_IMPULS, true);
      timerWrite(My_timer, 0);
      timerAlarmEnable(My_timer); //Just Enable
      stan_ssr = 0;
      q = "xxxxxxxxxxxxxxxxxx";
    } else {
      digitalWrite(pin_ssr, LOW);
      timerAlarmDisable(My_timer);

    }

  }

I tak...w przerwaniu ustawiam czas dla timera i go uruchamiam, w timerze włączam pin i ustawiam go na wyłączenie pinu...to wszystko...przerwanie działa, timer nie chce się uruchomić 😭 (sprawdzałem w tym prostym warunku na początku loop() czy zmieniło zawartość String, który jest modyfikowany w timerze)

Edytowano przez farmaceuta

Patrzcie jaki ze mnie głupi ch*** ...zrobiłem błąd porownanie-przypisanie, czyli standard🤣 na szczęście @orb777 namówił mnie żebym zapytał al...i od ręki miałem poprawną odpowiedź...czas poświęcony na znalezienie błędu?? Ze 3 godziny 😞🥴

Screenshot_20251026-191514-443.thumb.png.0fc525b647a3fda36a16587d62142ee3.png

  • Lubię! 1
(edytowany)
5 minut temu, orb777 napisał:

@farmaceuta, w sumie nie znam się, ale czy w tym kodzie testowym (?) nie jest podobny przypadek?

O ja pier***...ten sam błąd 🥴😭 już nikt nigdy nie uwierzy mi że jestem dobrym programistą 🥴😁 

Zaleta kopiuj wklej to że szybko...a wada to że jednak wolno 😉

Edytowano przez farmaceuta
(edytowany)

@farmaceuta Polecam zasadę z pracy jako programista: Twój kod, Twoja odpowiedzialność. Czy go skopiujesz, wygenerujesz za pomocą AI czy napiszesz ręcznie to obojętne, ale jak nie działa to Ty dostaniesz opier*** 😉 Więc go przeczytaj po skopiowaniu, co by nie było kwiatków.

Edytowano przez H1M4W4R1
  • Lubię! 2
5 minut temu, H1M4W4R1 napisał:

@farmaceuta Polecam zasadę z pracy jako programista: Twój kod, Twoja odpowiedzialność. Czy go skopiujesz, wygenerujesz za pomocą AI czy napiszesz ręcznie to obojętne, ale jak nie działa to Ty dostaniesz opier*** 😉 Więc go przeczytaj po skopiowaniu, co by nie było kwiatków.

Zgadzam się w całości 👍 po prostu skopiowałem porównanie z warunku i umieściłem go w if'ie bez usunięcia jednego =...już kilkakrotbie ten błąd popełniłem w życiu i zawsze mnie to kosztowało godziny myślenia😅

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...