wemos d1 mini e interrupt
Posted: Sat Jun 03, 2017 6:15 am
hi,
I'm trying to read pulses to measure the consumption of water, gas and electricity through a wemos d1 mini, along with reading the temperature and humidity with a dht22.
The software does not mistake me, but it does not work, as if it always stops in interruptions.
Can you help me?
thank you all
I'm trying to read pulses to measure the consumption of water, gas and electricity through a wemos d1 mini, along with reading the temperature and humidity with a dht22.
The software does not mistake me, but it does not work, as if it always stops in interruptions.
Can you help me?
thank you all
Code: Select all
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Bounce2.h>
#include <EEPROM.h>
#include <DHT.h> // DHT library from http://github.com/adafruit/DHT-sensor-library
// Written by ladyada, public domain
#define DHTPIN 2 // what pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE, 20);
const char* ssid = "linksys_EXT1";
const char* password = "YourPASS";
const char* mqtt_server = "192.168.1.60";
long previousMillis = 0;
long interval = 60000;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
const char* outTopic = "home/cantina/stato/output/1";
const char* inTopic = "home/cantina/luce";
const char* outTopic_dht_temp = "home/cantina/temperatura";
const char* outTopic_dht_umid = "home/cantina/umidita";
const char* outTopic_gas = "home/cantina/gas";
const char* outTopic_acqua = "home/cantina/acqua";
const char* outTopic_luce = "home/cantina/enel";
const char* outTopic_luce_imp = "home/cantina/enel_imp";
int gas = 14;
int acqua = 13;
int luce = 12;
volatile byte state = LOW;
//int state_acqua; //the state of the input
//int oldstate_acqua;
//int state_luce; //the state of the input
//int oldstate_luce;
//int state_gas; //the state of the input
//int oldstate_gas;
unsigned long t; //timer
//unsigned long s; //samples
//unsigned long c; //count
//unsigned long f; //frequency
static long p1;
static long p2;
static long p3; //precedente
static long diff1;
static long diff2;
static long diff3;
unsigned long a;
// Instantiate a Bounce object :
//Bounce debouncer = Bounce();
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
//Serial.print("Connecting to ");
//Serial.println(ssid);
//WiFi.begin(ssid, password);
WiFi.begin(ssid);
while (WiFi.status() != WL_CONNECTED) {
for(int i = 0; i<500; i++){
delay(1);
}
Serial.print(".");
}
// Serial.println("");
//Serial.println("WiFi connected");
//Serial.println("IP address: ");
//Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
//Serial.print("Message arrived [");
//Serial.print(topic);
//Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
//Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Cantina_test")) {
//Serial.println("connected");
// Once connected, publish an announcement...
client.publish(outTopic, "py-home-slave booted");
// ... and resubscribe
client.subscribe(inTopic);
} else {
//Serial.print("failed, rc=");
//Serial.print(client.state());
//Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
for(int i = 0; i<5000; i++){
delay(1);
}
}
}
}
void leggi_dht(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
float h = dht.readHumidity();
float f = dht.readTemperature();
if (isnan(h) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
previousMillis = currentMillis;
//Serial.println("DHT sensor read and transmitted");
char buffer[10];
dtostrf(f,2,2, buffer);
client.publish(outTopic_dht_temp,buffer);
//Serial.print(buffer);
dtostrf(h,2,2, buffer);
client.publish(outTopic_dht_umid,buffer);
//Serial.print("Temperature: ");
//Serial.print(f);
//Serial.print("Umidita: ");
//Serial.print(h);
}
}
void leggi_acqua()
//diff1
{
t = millis(); // read time at start of sampling
diff1= t-p1;
if (diff1 >0.1){
client.publish(outTopic_acqua, "1");
p1=t;
}
}
void leggi_gas()
//diff2
{
t = millis(); // read time at start of sampling
diff2= t-p2;
if (diff1 >0.1){
client.publish(outTopic_gas, "1");
p1=t;
}
}
void leggi_luce()
//diff3
{
t = millis()/1000;//trasformo in secondi
diff3=t - p3;
if ( diff3 > 0.1 ) { // Se non รจ il primo blink calcola il consumo
a=3600/(t - p3);
char buffer[10];
dtostrf(a,2,2, buffer);
client.publish(outTopic_luce, buffer);
p3=t;
client.publish(outTopic_luce_imp, "1");
}}
void setup() {
dht.begin();
pinMode(gas, INPUT); // Initialize the gas pin as an input
pinMode(acqua, INPUT);
pinMode(luce, INPUT);
Serial.begin(115200);
setup_wifi(); // Connect to wifi
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
attachInterrupt(digitalPinToInterrupt(luce), leggi_luce, FALLING);
attachInterrupt(digitalPinToInterrupt(acqua), leggi_luce, FALLING);
attachInterrupt(digitalPinToInterrupt(gas), leggi_luce, FALLING);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
leggi_dht();
}