Skocz do zawartości

Zastąpienie funkcji delay() w przerwaniu od timera - ESP-WROOM-32


Viperooo

Pomocna odpowiedź

Witam

Mam pewien problem używam przerwania od timera co 10min, sprawdzam stan zbiornika i poziom wilgotności gleby jeśli poziom wody jest OK, a wilgotność mała trzeba załączyć pompkę na minutę i wyłączyć:

#include "Pump.h"
#include "globals.h"
#include <BluetoothSerial.h>
hw_timer_t *timer = NULL;
BluetoothSerial serialBt;

void Cycle()
{
  if (IsLevelSufficient)
  {
    if (!IsMoistureSufficient())
    {

      Pump::On();
      Serial.println("Pompa wlaczona");
      delay(5000);
      Pump::Off(); // Wyłącz pompę
      Serial.println("Pompa wylaczona");
    }
  }
}
void IRAM_ATTR onTimer()
{
  Serial.println("W przerwaniu");
  Cycle();
}
void setup()
{
  Serial.begin(115200);
  serialBt.begin("ESP32-BTX");
  Serial.println("Czekam na polaczenie...");
  InitializeSensors();
  Pump::Initialize();
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 600000000, true);
  timerAlarmEnable(timer);
}

int ReadMoisture()
{
  int dry = 2695, wet = 1100;
  int data = analogRead(AOUT);
  int moistValue = map(data, dry, wet, 0, 100);
  return moistValue;
}

void loop()
{
  if (serialBt.connected())
  {
      Serial.println("Połączono przez Bluetooth!");
      Serial.println(ReadMoisture() + "%");
      delay(700);
  }
}

Moje pytanie brzmi czy można zastąpić delay inaczej niż używając millis() (próbowałem różne warianty i nie działa)? Po prostu chce żeby sprawdzanie było co 10 minut i jeśli warunki są spełnione włączamy pompkę na 5 sekund i wyłączamy. Nie wiem też czy nie wpływałoby to na wysyłanie danych przez bluetooth w funkcji loop() (wysyłam dane do prezentacji na telefon). Czy może wogóle delay nie jest tutaj zły?

Link do komentarza
Share on other sites

@Viperooo w pierwszym warunku musisz sobie dodac do millisa ten twoj czujnik czy co tam masz i powinno dzialac... 

if (millis() - last_time > 600000UL) {
    stan = 1;
    last_time = millis();
    last_time_pump = millis();
    //wlacz pompe tutaj
 } 
   if (stan) { 
    if (millis() - last_time_pump > 60000UL) {
      //wylacz pompe tutaj
      stan = 0;
    }

 

Link do komentarza
Share on other sites

W przerwaniu to sobie ustaw jakąś flagę (zmienną) informującą o konieczności włączenia pompy. Pompę obsługuj odczytując (i kasując odpowiednio) tę flagę w programie głównym (loop).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.