Chat freely about anything...

User avatar
By marioifix
#76471 hi i have one problem with interrupt
who hel me?
Code: Select all#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>


/*Nome del dispositivo*/
#define NOME "TRTT18"

/* Parametri della rete Wifi */
const char* ssid = "xxxx";
const char* password = "xxxx";

/* Indirizzo del server MQTT */
const char* mqtt_server = "192.168.27.20";
const char* topic= "sensori";


/* Indirizzo Ip Statico assegnato al dispositivo */
IPAddress ip(192, 168, 27, 118);
IPAddress ipGw(192, 168, 27, 254);
IPAddress ipSubnet(255, 255, 255, 0);
IPAddress ipDns(8, 8, 8, 8);



char MyIp[16];

/* Definizione dei pin da controllare */
#define led 0
#define SWITCH_ONOFF 4
#define METRI 5


WiFiClient espClient;
PubSubClient client(espClient);
Ticker MyTiket;

void setup()
{


  /*  Abilito l'interrupt per contare il numero dei giri effettuati     */
  /*  Sul fronte di discesa                                             */
  /*  LOW     Scatta quando il pin è Basso                              */
  /*  CHANGE  Scatta sul cambiamento di stato                           */
  /*  RISING  Scatta quando da basso va alto                            */
  /*  FALLING Scatta quando da alto va basso                            */


  pinMode(METRI, INPUT_PULLUP);
  pinMode(SWITCH_ONOFF, INPUT_PULLUP);
  pinMode(led, OUTPUT);
 
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  reconnect();
  invia_status();
 attachInterrupt(digitalPinToInterrupt(METRI), invia_metri, FALLING );
//  attachInterrupt(digitalPinToInterrupt(SWITCH_ONOFF), invia_status, CHANGE );
  MyTiket.attach(1, invia_status);

}




/* Funzione di connessione alla rete Wifi */
void setup_wifi() {

  String SIp;
  IPAddress Ip;

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, ipDns, ipGw, ipSubnet); //Commentare questa riga se si vuole che l'indirizzo Ip sia assegnato dal DHCP
  WiFi.begin(ssid, password);             //Connessione alla Wifi

  /* Attendo la connessione Wifi */
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  /* Salvo l'indirizzo IP */
  Ip = WiFi.localIP();
  SIp = IpAddress2String(Ip);
  SIp.toCharArray(MyIp, SIp.length() + 1);

}

/* Converte IPAddress In Char */
String IpAddress2String(const IPAddress& ipAddress)
{
  return String(ipAddress[0]) + String(".") + \
         String(ipAddress[1]) + String(".") + \
         String(ipAddress[2]) + String(".") + \
         String(ipAddress[3])  ;
}



/* Connessione al server MQTT */
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("Tentativo di connessione al server MQTT...");
    // Attempt to connect
    if (client.connect(MyIp)) {
      Serial.print("Server MQTT Connesso Id : ");
      Serial.println(MyIp);

      // ...resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("Connessione fallita, rc=");
      Serial.print(client.state());
      Serial.println(" riprovo tra 5 secondi ");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {

        if (WiFi.status() != WL_CONNECTED) {
          Serial.println("Wifi Disconnessa");
          Serial.println("Tentativo di riconnessione Alla rete Wifi");
          setup_wifi();
          reconnect();
        }else{
          if (!client.connected()) {
              reconnect();         
          }
        }


}

/*Invia lo stato ON/OFF */
void invia_status() {

  int status_onoff;
  char msg[50];

  /* Compongo il messaggio */
  status_onoff = digitalRead(SWITCH_ONOFF);    //Leggo lo stato
  msg[0] = '\0';
  strcpy(msg, "TIME");         //Identificatore del tipo di messaggio
  strcat(msg, "|");            //Separatore
  strcat(msg, NOME);           //Nome del dispositivo
  strcat(msg, "|");            //Separatore
  strcat(msg, MyIp);           //Indirizzo IP del dispositivo
  strcat(msg, "|");            //Separatore
  if (status_onoff == LOW) {   //Stato macchina
    strcat(msg, "0");
    digitalWrite(led, LOW);
  } else {
    strcat(msg, "1");
    digitalWrite(led, HIGH);
    //tempo1=millis();
  }
  /* Lo invio */
  Serial.println(msg);
  client.publish(topic, msg, true);

}

/* Invia il flag metri */
void invia_metri() {

  char msg[50];
  msg[0] = '\0';
  strcpy(msg, "METERS");       //Identificatore del tipo di messaggio
  strcat(msg, "|");            //Separatore
  strcat(msg, NOME);           //Nome del dispositivo
  strcat(msg, "|");            //Separatore
  strcat(msg, MyIp);           //Indirizzo IP del dispositivo
  strcat(msg, "|");            //Separatore
  strcat(msg, "1");            //Indica un giro completo
digitalWrite(led, LOW);
  /* Lo invio */
  Serial.println(msg);
  client.publish(topic, msg, true);
 
}