#include <LiquidCrystal.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <stdio.h>
#include <stdlib.h>
LiquidCrystal lcd(12,13,17,16,27,14);
bool entrada_anterior = 0;
long t = 4000;
unsigned long t_pulsador_subir = 200;
unsigned long t_pulsador_bajar = 200;
bool pulsador_subir,pulsador_bajar;
unsigned long t_pantalla = 1000;
unsigned long t_mqtt=1000;
int porcentaje = 0, porcentaje_ant = 0;
const char* mqttServer = "instrumentacion-uji.dynv6.net";
const int mqttPort = 1883;
const char* client_name = "iluminacion_mesa01";
WiFiClient espClient;
PubSubClient client(espClient);
void PubMQTT(float potencia)
{
char str[10];
int len = snprintf(str,10, "%.2f",potencia);
client.publish("mesa01/luz/read_power",(uint8_t*) str,len,true);
Serial.print("Publicacion->");
Serial.print("mesa01/luz/read_power :");
Serial.println(str);
}
void lectura(char* topic, byte* payload, unsigned int length)
{
Serial.print("lectura->");
Serial.print(topic);
Serial.print(" : ");
char message[length+1]={0x00};
for(int i=0;i<length;i++)
message[i]=(char)payload[i];
message[length]=0x00;
porcentaje = atoi(message);
Serial.println(porcentaje);
if (porcentaje <0) porcentaje = 0;
if (porcentaje>100) porcentaje = 100;
t = 8000-80*porcentaje;
}
void setup() {
Serial.begin(115200);
pinMode(26, INPUT);
pinMode(25, OUTPUT);
pinMode(18, INPUT_PULLUP);
pinMode(19, INPUT_PULLUP);
lcd.begin(16, 2);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "",6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
client.setServer(mqttServer, mqttPort);
client.setCallback(lectura);
while (!client.connected())
{ Serial.print("Connecting to MQTT...");
if (client.connect(client_name))
Serial.println("connected");
else
{ Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
client.subscribe("mesa01/luz/set_power");
PubMQTT(porcentaje);
}
void loop() {
pulsador_subir = digitalRead(18);
pulsador_bajar = digitalRead(19);
if ((pulsador_subir==0)&&(millis()>=t_pulsador_subir)) { // sube la luminosidad 5% 100% son 8000ms 5% son 0.4ms
t=t-400; // en microsegundos
t_pulsador_subir=millis()+200;
if (t<=0) t=0;
porcentaje = (8000-t)/80;
}
if (pulsador_subir==1) t_pulsador_subir=millis()+200; //recuerda 0 pulsado 1 sin pulsar
if ((pulsador_bajar==0)&&(millis()>=t_pulsador_bajar)) { // baja la luminosidad 5% como 100% son 8000ms 5% son 0.4ms
t=t+400; // en microsegundos
if (t>8000) t=8000;
t_pulsador_bajar=millis()+200;
porcentaje = (8000-t)/80;
}
if (pulsador_bajar==1) t_pulsador_bajar=millis()+200; //recuerda 0 pulsado 1 sin pulsar
bool entrada = digitalRead(26);
if (entrada_anterior != entrada) {
delayMicroseconds(t);
digitalWrite(25,1);
delayMicroseconds(100);
digitalWrite(25,0);
}
entrada_anterior = entrada;
if (millis()>t_pantalla){
t_pantalla += 500;
lcd.setCursor(0,0);
lcd.print(porcentaje);
lcd.print(" ");
}
if (millis()>t_mqtt) {
t_mqtt += 500;
if (porcentaje != porcentaje_ant)
PubMQTT(porcentaje);
porcentaje_ant = porcentaje;
if (!client.loop()) {
Serial.println("Desconnectado");
while (!client.connected())
{ Serial.print("Connecting to MQTT...");
if (client.connect(client_name ))
Serial.println("connected");
else
{ Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
client.subscribe("mesa01/luz/set_power");
}
}
}
/* APARTADO 6 PULSADORES
bool entrada_anterior = 0;
long t = 4000;
unsigned long t_pulsador_subir = 200;
unsigned long t_pulsador_bajar = 200;
bool pulsador_subir,pulsador_bajar;
unsigned long t_pantalla = 1000;
void setup() {
Serial.begin(115200);
pinMode(26, INPUT);
pinMode(25, OUTPUT);
pinMode(18, INPUT_PULLUP);
pinMode(19, INPUT_PULLUP);
lcd.begin(16, 2);
}
void loop() {
pulsador_subir = digitalRead(18);
pulsador_bajar = digitalRead(19);
if ((pulsador_subir==0)&&(millis()>=t_pulsador_subir)) { // sube la luminosidad 5% 100% son 8000ms 5% son 0.4ms
t=t-400; // en microsegundos
t_pulsador_subir=millis()+200;
if (t<0) t=0;
}
if (pulsador_subir==1) t_pulsador_subir=millis()+200; //recuerda 0 pulsado 1 sin pulsar
if ((pulsador_bajar==0)&&(millis()>=t_pulsador_bajar)) { // baja la luminosidad 5% como 100% son 8000ms 5% son 0.4ms
t=t+400; // en microsegundos
if (t>8000) t=8000;
t_pulsador_bajar=millis()+200;
}
if (pulsador_bajar==1) t_pulsador_bajar=millis()+200; //recuerda 0 pulsado 1 sin pulsar
bool entrada = digitalRead(26);
if (entrada_anterior != entrada) {
delayMicroseconds(t);
digitalWrite(25,1);
delayMicroseconds(100);
digitalWrite(25,0);
}
entrada_anterior = entrada;
}
*/
/* APARTADO 5 TIEMPO
bool entrada_anterior = 0;
unsigned long t = 0;
void setup() {
Serial.begin(115200);
pinMode(26, INPUT);
pinMode(25, OUTPUT);
pinMode(18, INPUT_PULLUP);
pinMode(19, INPUT_PULLUP);
}
void loop() {
bool entrada = digitalRead(26);
if (entrada_anterior != entrada) {
t = 8000 - (millis()% 4000) * 2;
delayMicroseconds(t);
digitalWrite(25,1);
delayMicroseconds(100);
digitalWrite(25,0);
}
entrada_anterior = entrada;
}
*/
/* APARTADO 4 angulo 45 90 135
bool entrada_anterior = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(26, INPUT);
pinMode(25, OUTPUT);
pinMode(18, INPUT_PULLUP);
pinMode(19, INPUT_PULLUP);
}
void loop() {
bool entrada = digitalRead(26);
if (entrada_anterior != entrada) {
// delayMicroseconds(2500); // 45º
//delayMicroseconds(5000); // 90º
delayMicroseconds(7500); // 135º
digitalWrite(25,1);
delayMicroseconds(100);
digitalWrite(25,0);
//Serial.println(porcentaje*100);
}
entrada_anterior = entrada;
}
*/