ESP8266 Interrupt wird nicht angenommen

OP (Firma: Bin Student) #6575481
Lesenswert?
• ▲
▼
Servus,

bin neu bei Mikrocontrollern.

Habe einen Sonoff S20 mit ESP8266. Aus diesem möchte ich eine 
Zeitschaltuhr mit API machen. Der Button vorne ist dafür da von einem 
manuell aus, zu manuell an und Automatik zu schalten (Kann man auch über 
API). In unregelmäßigen Zeitabständen funktoniert der Button der über 
einen Interrupt definiert ist nicht und nach unregelmäßiger Zeit geht 
wieder alles.

Woran kann das liegen? Danke für eure Hilfe :)

Was ich schon probiert habe:

Alle betroffenen Funktionen mit IRAM_ATTR geflagt.
Mit dem Interrupt nur einen Bool ändern und in der loop die 
Statusänderung ausführen.

Hier ist mein Code, falls ihr über die Klassen was Wissen wollt meldet 
euch.
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include <EEPROM.h>
4
#include <ESPAsyncWebServer.h>
5
#include <AsyncJson.h>
6
#include <ArduinoJson.h>
7
#include <ezTime.h>
8
#include "SonoffS20.h"
9
#include "Timer.h"
10

11
#define EEPROM_SIZE 10
12

13
const char * ssid = "Geheim";
14
const char * pass = "Geheim";
15
const char * ntpServer = "192.168.178.1";
16
const long debouncing_time = 15;
17

18
volatile unsigned long last_micros;
19

20
bool interrupt = false;
21
Timezone * local;
22
SonoffS20 * hardware;
23
Timer * timer;
24
AsyncWebServer server(80);
25

26

27
void IRAM_ATTR ISR() {
28
  if((long)(micros() - last_micros) >= debouncing_time * 1000) {
29
    hardware->setButtonState((hardware->getButtonState() + 1 ) % 3);
30
    last_micros = micros();
31
  }
32
}
33

34
void setup() {
35
  EEPROM.begin(EEPROM_SIZE);
36

37
  hardware = new SonoffS20(0);
38
  attachInterrupt(digitalPinToInterrupt(0), ISR, RISING);
39
  timer = new Timer(2);
40

41
  WiFi.begin(ssid, pass);
42
  while (WiFi.status() != WL_CONNECTED) delay(1000);
43

44
  local = new Timezone();
45
  local->setLocation("Europe/Berlin");
46
  setServer(ntpServer);
47
  waitForSync();
48

49
  // Routes
50
  {
51
   // ... Webserver sachen funktionieren einwandfrei
52
  }
53

54
void loop() {
55
  events();
56
  if (hardware->getButtonState() == 2) {
57
    if (timer->timeBetweenStartAndEnd(local->dateTime("~THi"))) {
58
      if (hardware->getRelay() == LOW) hardware->setRelay(HIGH);
59
    }
60
    else if (hardware->getRelay() == HIGH) {
61
      hardware->setRelay(LOW);
62
      }
63
  }
64
  delay(100);
65
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.