Buenas tardes. Disculpen espero alguien pueda ayudarme. Estoy haciendo un proyecto pero necesito enviar losdatos de un contador a una nube, lo que pasa es que al momento de hacer esa función la otra función que debe cumplirse de un temporizador no avanza hasta que se envie el dato del contador a la nube. Tal vez podrían guiarme en alguna slcuión,
. Aqui comparto mi codigo.
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <UbidotsEsp32Mqtt.h>
//Variables reseteo de funcion millis
long previousMillis = 0;
//Control de dispensador (Rele e IR)
int lect_IR = 0;
const int pinIR = 25;
int bomba = 26;
volatile int cont;
int seg = 0;
int seg1 = 0;
//Variables sensor Ultrasónico (Medidor de cantidad)
volatile const int Trigger = 32;
volatile const int Echo = 15;
volatile long t = 0; //timepo que demora en llegar el eco
volatile long d = 0; //distancia en centimetro
volatile int porcent = 0;
int lect_ULTRA = 0;
const int ON_ULTRA = 19; //Switch para presentar cantidad restante del envase
//Variable de la alarma (buzzer)
int buzzer = 33;
//Credenciales WiFi
#define WIFI_SSID "INTERNET_CNT YEPEZ"
#define WIFI_PASSWORD "Titokeluckyfer12345"
//Constantes del servidor Ubidots
#define LAB_CANT "canti"
#define LAB_VASOS "vasos"
#define LAB_pH "pH"
//Credenciales Proyecto Ubidots
#define UBIDOTS_TOKEN "BBFF-TpmxQ3Lse5usJ2zKiS59iVs46PCOiL"
#define DEVICE_LABEL "dispensador-1"
Ubidots ubidots (UBIDOTS_TOKEN);
/****************************************
* Auxiliar Functions
****************************************/
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();
}
#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);
void setup() {
Serial.begin(115200);
//Pines para dispensador (Rele e IR)
pinMode(pinIR , INPUT);
pinMode(bomba, OUTPUT);
//Pines para el sensor Ultrasónico
pinMode(Trigger, OUTPUT); //pin como salida
pinMode(Echo, INPUT); //pin como entrada
pinMode(ON_ULTRA, INPUT);
digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
//Pin buzzer (alarma)
pinMode(buzzer, OUTPUT);
lcd.begin(16,2);
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.setCursor(0, 0);
lcd.home();
lcd.clear();
//Configuración WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Conectando a la red ");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(250);
}
Serial.println();
Serial.print("Conectado a: ");
Serial.println(WIFI_SSID);
//Inicializa conexión hacia FIREBASE
Serial.println("Conectando a Ubidots...");
ubidots.connectToWifi(WIFI_SSID, WIFI_PASSWORD);
ubidots.setCallback(callback);
ubidots.setup();
ubidots.reconnect();
Serial.println();
//ubidots.setDebug(true);
}
void loop() {
unsigned long currentMillis = millis();
//Reconecta con el servidor de Ubidots
if (!ubidots.connected()){
ubidots.reconnect();
}
//Código de Rele e IR
lcd.setCursor(0, 0);
lcd.print(" Esperando....");
lcd.setCursor(0, 1);
lcd.print(" Acerque el vaso");
lect_IR = digitalRead(pinIR); //lectura digital de pin
if (lect_IR == LOW){
delay(25);
vaso_DETECT();
if (seg >= 20){
retire_VASO();
}
}
if (seg >= 20 || lect_IR == HIGH) {
esperando_VASO();
}
delay(400);
//Para el sensor Ultrasónico
datos_ULTRA();
lect_ULTRA = digitalRead(ON_ULTRA);
if (lect_ULTRA == HIGH){
delay(25);
muestra_CANTIDAD();
}
//Alarma envase casi vacío
if (porcent <= 20){
llenar_ENVASE();
}
}
/*
* FUNCIONES A SER LLAMADAS POR LAS CONDICIONES
* VOID LOOP MÁS PRESENTABLE Y VACÍO
*/
//Detección y llenado del vaso
void vaso_DETECT(){
digitalWrite(bomba, HIGH);
lcd.backlight();
lcd.display();
lcd.clear();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > 1000){
previousMillis = currentMillis;
seg ++;
lcd.setCursor(0, 0);
lcd.print(" Aprox. 20 seg. ");
lcd.setCursor(0, 1);
lcd.print("Ha(n) pasado: ");
lcd.print( seg);
cont_VASOS();
if (seg > 20){
lcd.setCursor(9, 1);
lcd.print("00");
}
}
}
//Función conteo de vasos
void cont_VASOS(){
if (lect_IR == LOW){
cont++;
while (lect_IR == LOW){
lect_IR = digitalRead(pinIR);
}
ubidots.add(LAB_VASOS, cont);
ubidots.publish(DEVICE_LABEL);
ubidots.loop();
}
}
//Función retirar el vaso
void retire_VASO(){
seg = 0;
digitalWrite(bomba, LOW);
lcd.setCursor(0, 0);
lcd.print(" Retire el vaso");
delay(2000);
lcd.noDisplay();
lcd.noBacklight();
}
//Función detectando vaso
void esperando_VASO(){
unsigned long currentMillis = millis();
seg = 0;
delay(25);
digitalWrite(bomba, LOW);
delay(20);
}
//Lectura del sensor Ultrasónico
void datos_ULTRA(){
digitalWrite(buzzer, LOW);
digitalWrite(Trigger, HIGH);
delay(10); //Enviamos un pulso de 10us
digitalWrite(Trigger, LOW);
t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
d = t/58.2; //escalamos el tiempo a una distancia en cm
porcent = map (d, 4, 26, 100, 0);
millis(); //Reatardo para que el sensor recolecte bien los datos
}
//Muestra cantidad del envase
void muestra_CANTIDAD(){
digitalWrite(buzzer, LOW);
lcd.backlight();
lcd.display();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Cant. restante");
lcd.setCursor(6,1);
lcd.print(porcent);
lcd.print(" %");
delay(500);
}
//Lectura <= 10% del envase
void llenar_ENVASE(){
lcd.backlight();
lcd.display();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Cant. restante");
lcd.setCursor(6,1);
lcd.print(porcent);
lcd.print(" %");
delay(500);
digitalWrite(buzzer, HIGH);
delay(300);
digitalWrite(buzzer, LOW);
ubidots.add(LAB_CANT, porcent);
ubidots.publish(DEVICE_LABEL);
ubidots.loop();
delay(50);
}