Forum: Mikrocontroller und Digitale Elektronik ESP8266 Interrupt wird nicht angenommen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Benjamin H. (Firma: Bin Student) (beohof)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.