En aquest cas el microcontrolador funciona com a servidor. El programa del microcontrolador és el següent:
#include <Adafruit_NeoPixel.h> #include <DHT.h> #include <SPI.h> #include <WiFiNINA.h> #define LED 6 // pota on hem connectat el LED #define DHTPIN 2 #define DHTTYPE DHT22
const char idXarxa[] = "xarxa-wifi"; // Nom del punt d'accés const char contrasenya[] = "contrasenya-wifi"; // Contrasenya de connexió float hum, temp, tempreal, tdeseada; String temperatura, humitat, mode, pro, best, RESDO; bool estat = LOW; bool enviar = false; int cont; int intensidad = 20; int status = WL_IDLE_STATUS; WiFiServer server(80); Adafruit_NeoPixel cadena = Adafruit_NeoPixel(3, 1, NEO_GRB + NEO_KHZ800); DHT dht(DHTPIN, DHTTYPE);
void setup() {
dht.begin();
Serial.begin(9600);
cadena.begin();
cadena.show();
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("No s'ha trobat el dispositiu Wi-Fi");
while (true);
}
String versio = WiFi.firmwareVersion();
if (versio < "1.0.0") {
Serial.println("Convindria actualitzar el firmware");
}
while (status != WL_CONNECTED) {
Serial.print("Connectant a la xarxa ");
Serial.println(idXarxa);
status = WiFi.begin(idXarxa, contrasenya);
delay(10000);
}
server.begin();
Serial.print("Connectat a ");
Serial.println(WiFi.SSID());
Serial.print("Estat de la connexió: ");
Serial.println(WiFi.status());
Serial.print("Adreça IP del dispositiu: ");
Serial.println(WiFi.localIP());
Serial.print("Intensitat del senyal: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
Serial.println();
Serial.print("Ja pots fer la teva connexió al dispositiu ");
Serial.println(WiFi.localIP());
}
void loop() {
float hum = dht.readHumidity();
float temp = dht.readTemperature();
tempreal = temp;
if (estat==HIGH){
temp=temp-1; //HISTERESIS
}
if (mode == "confort") {
if (temp <19) {
estat = HIGH;
digitalWrite(LED, estat);
} else{
estat=LOW;
digitalWrite(LED, estat);
}
}
if (mode == "noche") {
if (temp < 15) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat=LOW;
digitalWrite(LED, estat);
}
}
if (mode == "invierno") {
if (temp < 5) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat = LOW;
digitalWrite(LED, estat);
}
}
if (mode == "perso") {
if (temp < tdeseada) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat = LOW;
digitalWrite(LED, estat);
}
}
if ((mode == "invierno") ||(mode== "noche")){ //apagar neopixel en modo noche y invierno
cadena.setPixelColor(0, 0, 0, 0);
cadena.show();
}
if ((mode == "")||(mode == "confort")||(mode =="perso")){
int a = 0, v = 0, r = 0;
byte p;
if (tempreal < 19) {
a = intensidad-((intensidad*4/5)/19)*tempreal;
r = 0;
v = 0;
}
if ((19 <= tempreal) && (tempreal <= 26)) {
a = 0;
v = intensidad - abs(((intensidad*4/5)/3.5)*(tempreal-22.5));
r = 0;
}
if (tempreal > 26) {
a = 0;
v = 0;
r = (intensidad/5) + ((intensidad*4/5)/9)*(tempreal-26);
}
cadena.setPixelColor(0, r, v, a); // R G B
cadena.show();
delay(1000);
}
if (status != WiFi.status()) {
status = WiFi.status();
if (status == WL_AP_CONNECTED) {
Serial.println("Dispositiu connectat al punt d'accés");
} else {
Serial.println("El dispositiu s'ha desconnectat del punt d'accés");
}
}
WiFiClient client = server.available();
if (client) {
Serial.println("Nou client");
String peticio = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (peticio.length() == 0) {
enviar = true;
break;
} else {
if (peticio.indexOf("GET") != -1) {
if (peticio.indexOf("action_page") != -1) {
best = "";
for (int x = 0; x < peticio.length(); x++) {
if (peticio[x] == '=') {
best += peticio[x+1];
if (peticio[x+2] != ' ') {
best += peticio[x+2];
if (peticio[x+3] != ' ') {
best += peticio[x+3];
}
}
}
}
intensidad = best.toInt();
}
if (peticio.indexOf("LED=1") != -1) {
pro = "";
cont = 0;
for (int x = 0; x < peticio.length(); x++) {
if (peticio[x] == '/') {cont++;}
if (cont == 2 && peticio[x] != '/'){
pro += peticio[x];
}
}
tdeseada = pro.toFloat();
if (tdeseada < 1) {
tdeseada = 1;
}
if (tdeseada > 26) {
tdeseada = 26;
}
mode = "perso";
if (temp < tdeseada) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat = LOW;
digitalWrite(LED, estat);
}
}
if (peticio.indexOf("actualizar") != -1){
mode = mode;
}
if (peticio.indexOf("LED=0") != -1){
estat = LOW;
digitalWrite(LED, estat);
mode = "";
cont = 0;
}
if (peticio.indexOf("invierno") != -1){
mode = "invierno";
cont = 0;
if (temp < 5) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat = LOW;
digitalWrite(LED, estat);
}
}
if (peticio.indexOf("confort") != -1){
mode = "confort";
cont = 0;
if (temp <19) {
estat = HIGH;
digitalWrite(LED, estat);
} else{
estat=LOW;
digitalWrite(LED, estat);
}
}
if (peticio.indexOf("noche") != -1){
mode = "noche";
cont = 0;
if (temp < 15) {
estat = HIGH;
digitalWrite(LED, estat);
} else {
estat=LOW;
digitalWrite(LED, estat);
}
}
}
peticio = "";
}
} else if (c != '\r') {
peticio += c;
}
}
}
if (enviar) {
if (!(isnan(hum) || isnan(temp))) {
temperatura = String(tempreal);
humitat = String(hum);
temperatura.replace('.', ',');
humitat.replace('.', ',');
RESDO = String(tdeseada);
RESDO.replace('.', ',');
client.println("HTTP/1.1 200 OK");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<meta charset='UTF-8'>");
client.println("<html>");
client.println("<body style = 'text-align:center; background-color: lightblue'");
client.println("<p></p>");
client.println("<p></p>");
client.println("<h1>Temperatura y humedad actuales</h1>"); // Bloque T y H
client.println("<p></p>");
client.println("<p></p>");
client.print("<p>T = ");
client.print(temperatura);
client.println(" °C</p>");
client.println("<p></p>");
client.print("<p>H = ");
client.print(humitat);
client.println(" %</p>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<button type='button'>");
client.println("<a href='/?actualizar'>Actualizar</a>");
client.print("</button>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<h1>La calefacción está "); // Estado calefacción
if(estat == HIGH) {
client.print("encendida</h1>");
}
if(estat == LOW) {
client.print("apagada</h1>");
}
client.println("<p></p>");
client.println("<p></p>");
if (cont == 0){
client.print("<h1>Modo manual ");
} else {
client.print("<h1>La caldera está encendida a ");
client.print(RESDO);
client.print("°C");
}
client.print("</h1>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<form>");
client.print("<button type='button'>");
client.print("<a onclick='myFunction()', id = 'url', href=''>Encender</a> ");
client.print("</button> ");
client.print("<input type = 'number', value = '19', id = 'T', max = '26', min = '1', ");
client.print("step = '0.5', style = 'width:50px; height:15px; text-align:right'>");
client.print(" °C ");
if (cont != 0){
if (pro.toFloat() > 26) {
client.print("<font color = 'red'> *La máxima temperatura permitida es ");
client.print("de 26 °C.</font>");
}
if (pro.toFloat() < 1) {
client.print("<font color = 'red'> *La mínima temperatura permitida es ");
client.print("de 1 °C.</font>");
}
}
client.print("</form>");
client.println("<p></p>");
client.print("<script>");
client.print("function myFunction() {");
client.print("var x = '/?LED=1/' + document.getElementById('T').value + '/';");
client.print("document.getElementById('url').href = x;}");
client.print("</script>");
client.println("<p></p>");
client.println("<p></p>");
if (mode == "confort"){
client.print("<h1>Modo Confort activado ");
} else if (mode == "invierno"){
client.print("<h1>Modo Invierno activado ");
} else if (mode == "noche"){
client.print("<h1>Modo Noche activado ");
} else {
client.print("<h1>Modos predefinidos");
}
client.println("</h1>"); // Botones Modos
client.println("<p></p>");
client.println("<p></p>");
client.print("<button type='button'>");
client.println("<a href='/?confort'>Confort</a>");
client.print("</button> ");
client.print("<button type='button'>");
client.println("<a href='/?noche'>Noche</a>");
client.print("</button> ");
client.print("<button type='button'>");
client.println("<a href='/?invierno'>Invierno</a>");
client.print("</button> ");
client.println("<h1></h1>");
client.println("<h1></h1>");
client.print("<button type='button'>");
client.println("<a href='/?LED=0'>Apagar/Desactivar</a>");
client.print("</button>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<h1>Regulador LED</h1>");
client.println("<p></p>");
client.print("<form action='/action_page.php' method='get'>");
client.print("0 <input type = 'range', name = 'intensidad' min='0' ");
client.print("max='150' step = '5'> 150 ");
client.print(" <input type='submit'>");
client.print("</form>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<p>Intensidad actual: ");
client.print(intensidad);
client.print("</p>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<font color = 'grey', size = '2px'>*Para cuando esté en ");
client.print("casa, el modo Confort está pensado para optimizar el uso de la ");
client.print("calefacción minimizando el gasto energético. La calefacción ");
client.print("se encenderá cuando la temperatura sea inferior a 19 °C.</font>");
client.println("<p></p>");
client.print("<font color = 'grey', size = '2px'>*A la hora de dormir no es necesaria una ");
client.print("temperatura muy elevada. En este caso, el modo Noche mantendrá la temperatura ");
client.print("por encima de los 15 °C.</font>");
client.println("<p></p>");
client.print("<font color = 'grey', size = '2px'>*Cuando no haya nadie en casa durante el ");
client.print("invierno solo será necesario evitar posibles heladas en las tuberías. El modo ");
client.print("Invierno mantendrá el hogar a una temperatura superior a los 5 °C.</font>");
client.println("</body>");
client.println("</html>");
delay(1);
enviar = false;
}
client.stop();
Serial.println("Fi de la connexió amb el client");
}
}
}

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.