Buongiorno a tutti!
Da qualche giorno ho un problema con un ESP8266 al quale è collegato un encoder incrementale che funge da contametri lineari, un display TFT ILI9341per la visualizzazione del dato ed un pulsante per il reset di quest'ultimo.
Inoltre un raspberry richiede il dato ogni minuto per poterlo utilizzare all'interno di una pagina web
il problema è che a volte di riavvia all'improvviso e non riesco a capirne il motivo, ho provato a fornirgli alimentazioni diverse anche con batteria per evitare eventuali sbalzi di corrente che avrebbero potuto causarne il riavvio...
vi lascio di seguito il codice:
#include <Arduino.h>
#include <math.h>
// TFT display library
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "Fonts/FreeSansBold24pt7b.h"
#include "Fonts/FreeSans9pt7b.h"
//WEB SERVER library
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
void IRAM_ATTR handleInterrupt();
//permette l'utilizzo degli interrupt usati per l'encoder
const char* SSID = "****************";
const char* psw = "****************";
ESP8266WebServer server(80);
//parametri wifi (SSID, password, porta)
//PINSs
#define encoderPinA D2
#define encoderPinB D3
// PIN a cui sono collegati gli encoder da definire per ogni encoder
#define resetButton D0
// //PIN tasto reset
// Pins for display
#define TFT_DC D4
#define TFT_CS D8
double stepMtl = 6000.0;
volatile unsigned long pos = 0;
volatile double mtl = 0.0;
volatile double precMtl = 0.0;
//Variabile che memorizza la lunghezza che stiamo misurando
void IRAM_ATTR doEncoderA();
void IRAM_ATTR doEncoderB();
void reset();
void webCGI();
void webResetData();
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
void testText();
void displayGraphics();
void onLoadGraphics();
void setup() {
Serial.begin(9600);
tft.begin();
//Mostra su Display;
tft.setRotation(1);
onLoadGraphics();
//inizio configurazione wifi
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, psw);
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(500);
}
//in attesa di connessione stampa caricamento
displayGraphics();
Serial.print("CONNESSO A: ");
Serial.println(SSID);
Serial.print("IP: ");
Serial.println(WiFi.localIP());
//quando connesso stampo parametri connessione
server.on("/", webCGI);
server.on("/resetData", webResetData);
server.on("/reset", reset);
server.begin();
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(resetButton, INPUT);
//definiamo l'input dei pin specificando che va attivata la resistenza di PULLUP
attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), doEncoderB, CHANGE);
//definiamo le intterupt (valore Pin int, funzione da chiamare, definisce cambiamento)
}
unsigned long dt, t1;
void loop(void) {
server.handleClient();
//risposta alle chiamate client
MDNS.update();
dt = millis() - t1;
if (dt > 1500) {
//convert to double with step/mm
mtl = pos/stepMtl;
int mInt = floor(mtl);
if(mtl < 0){ mInt += 1; }
int mDec = fabs(floor((mtl-mInt)*10));
if(mDec == 10){ mDec = 0;}
if(digitalRead(resetButton) == HIGH){
reset();
}
//Serial.println(pos);
tft.fillRect(0, 20, 320, 120, ILI9341_BLACK);
tft.setCursor(0, 100); tft.setFont(&FreeSansBold24pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2.2);
tft.print(mInt); //INSERIRE VARIABILE METRI
tft.print(".");
tft.print(mDec);
Serial.print("\n misura: ");
Serial.println(mtl);
Serial.print("\n steps: ");
Serial.println(pos);
t1 = millis();
}
}
void displayGraphics(){
//prepare bkg and font
tft.fillScreen(ILI9341_BLACK);
tft.setFont(&FreeSans9pt7b);
tft.fillRect(0, 20, 320, 120, ILI9341_BLACK);
tft.setCursor(0, 100); tft.setFont(&FreeSansBold24pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2);
tft.print(mtl);
//CONTATORE
tft.setCursor(275, 15);tft.setFont(&FreeSans9pt7b); tft.setTextSize(1);
tft.println("MTL");
tft.println("");
//PREV VALUE
tft.println("");
//WEB SERVER IP
tft.setCursor(10, 210); tft.setFont(&FreeSans9pt7b); tft.setTextSize(0.5);
tft.println("DNS: http://contametri-luxpan2.local/");
tft.setCursor(10, 230); tft.setTextSize(0.5);
tft.print("IP: ");
tft.println(WiFi.localIP());
//WIFI CONNECTED?
if(WiFi.status() == WL_CONNECTED){
tft.fillCircle(305, 215, 10, ILI9341_GREEN);
} else {
tft.fillCircle(305, 215, 10, ILI9341_RED);
}
}
void onLoadGraphics(){
tft.fillScreen(ILI9341_BLACK);
tft.fillRect(110,70, 100, 100, ILI9341_BLUE);
tft.fillTriangle(64, 173, 64, 20, 223, 20, ILI9341_BLACK);
tft.fillRect(110, 70, 48, 48, ILI9341_RED);
tft.fillRect(115, 75, 13, 38, ILI9341_WHITE);
tft.fillRect(115, 102, 38, 13, ILI9341_WHITE);
tft.setCursor(90, 200);
tft.setFont(&FreeSans9pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
tft.println("Caricamento...");
}
void reset(){
digitalWrite(LED_BUILTIN, LOW);
precMtl = mtl;
mtl = 0;
pos = 0;
tft.fillRect(0, 135, 320, 50, ILI9341_BLACK);
tft.setCursor(10, 165);
tft.setFont(&FreeSans9pt7b); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE);
tft.print("Valore precedente: ");
tft.print(precMtl);
tft.println(" MTL");
digitalWrite(LED_BUILTIN, HIGH);
}
void IRAM_ATTR doEncoderA(){
//funzione che si attiverà quando l'encoder cambierà di stato
if (digitalRead(encoderPinA) == HIGH){
//se il pin A dell'encoder risulta alto controllo lo stato di B per verificare se questo sta girando in senso orario o antiorario
if (digitalRead(encoderPinB) == LOW){
//se il pin B risulta basso allora gira in senso orario, quindi incrementa il valore di posizione
pos--;
} else {
// b alto quindi antiorario, decremento posizione
pos++;
}
} else {
//definiamo il comportamento nel caso in cui A sia basso
if (digitalRead(encoderPinB) == HIGH){
//se B è alto allora stiamo girando in senso orario, incremento pos
pos--;
} else {
//B basso, antiorario, decremento pos
pos++;
}
}
}
void IRAM_ATTR doEncoderB(){
//controlliamo ugualmente la linea B dell'encoder
if (digitalRead(encoderPinB) == HIGH){
if (digitalRead(encoderPinA) == HIGH){
pos--;
} else {
pos++;
}
} else {
if (digitalRead(encoderPinA) == LOW){
pos--;
} else {
pos++;
}
}
}
void webCGI(){
String metri = String(mtl);
server.sendHeader("Access-Control-Allow-Origin", "*");
server.send(200, "text/plain", metri);
}
void webResetData(){
String metriPrec = String(precMtl);
server.sendHeader("Access-Control-Allow-Origin", "*");
server.send(200, "text/plain" ,metriPrec);
}
Grazie mille