Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Sonòmetre

Programa del grup 1

En aquest cas s'ha dissenyat un sonòmetre per a una biblioteca que té establerts tres nivells de soroll. El microcontrolador treballa com a client i envia periòdicament les dades a un full de càlcul de Google i, a més, canvia el color del LED. Un applet d'IFTTT publica a un compte específic de Twitter la informació que es va penjant al full de càlcul. Addicionalment, hi ha una aplicació per a mòbils que permet consultar la informació. El programa del microcontrolador és el següent:

#include <SPI.h>	// Carreguem la biblioteca SPI
#include <WiFiNINA.h>	// Carreguem la biblioteca WiFiNINA
#include <Adafruit_NeoPixel.h> // pota on hem connectat el LED
#define MICpin A6
#define numMost 500
#define llindar1 4
#define llindar2 13
#define LED 1 
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800);
WiFiSSLClient client;
const char idXarxa[] = "xarxa";	// Nom del punt d'accés
const char contrasenya[] = "contrasenya";	// Contrasenya de connexió
const char formulari[] = "1FAIpQLSdYL27gjcTvKyE8Z6ucHTwhCqaPrIobfEaHjJEG4t5p7cZ1eQ";
const char adrePost[] = "/forms/u/0/d/e/1FAIpQLSdYL27gjcTvKyE8Z6ucHTwhCqaPrIobfEaHjJEG4t5p7cZ1eQ/formResponse";
String camp = "entry.250467936";
char server[] = "docs.google.com";
String data;
String estat;
int status = WL_IDLE_STATUS;
int lectures[numMost];
int lectura, maxim, minim, suma;
float rms, lecCorr, mitjana;
void setup() {    // Inicialització
	Serial.begin(9600);	// Monitor sèrie
	cadena.begin(); // Inicialitza els NeoPixels		
	cadena.show();
	while (!Serial) {
		;	// Esperem que l'usuari obri el monitor sèrie
	}
	if (WiFi.status() == WL_NO_MODULE) {
		Serial.println("No s'ha trobat el dispositiu Wi-Fi");
		while (true);	// Bloquegem el programa
	}
	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);	// Ho tornarem a intentar passats 10 s
	}
	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(); 
}
void loop() {    // Programa que es repeteix indefinidament
	if (status != WiFi.status()) {	// Mirem si ha canviat l'estat de la connexió
		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");
		}
	}
	maxim = 0;
	minim = 1024;
	suma = 0;
	for (int i = 0; i < numMost; i++){
		lectura = analogRead(MICpin);
		suma = suma + lectura;
		if(lectura > maxim){
			maxim = lectura;
		}
		if(lectura < minim){
			minim = lectura;
		}
		lectures[i] = lectura;
	}
	mitjana = float(suma) / numMost;
	rms = 0;
	for (int i = 0; i < numMost; i++){
		lecCorr = float(lectures[i]) - mitjana;
		rms = rms + lecCorr * lecCorr;
	}
	rms = sqrt(rms / numMost);
	if (rms<llindar1){
		cadena.setPixelColor(0, 0, 255, 0); // Pixel 0 verd
		cadena.show(); // Actualitza
		estat="LOW";
	} else if ((llindar1<rms) && (rms<llindar2)){
		cadena.setPixelColor(0,255, 111, 0); // Pixel 0 taronja
		cadena.show(); // Actualitza
		estat="MEDIUM";
	} else if (rms>llindar2){
		cadena.setPixelColor(0, 255, 0, 0); // Pixel 0 vermell
		cadena.show();
		estat="HIGH";
	}	// Actualitza
	data = "";
	data += camp;
	data += "=";
	data += estat;
	data += "&submit=Submit";
	if (client.connect(server, 443)) {
		Serial.println("Connectat");
		client.print("POST ");
		client.print(adrePost);
		client.print("?formkey=");
		client.print(formulari);
		client.println("&ifq HTTP/1.1");
		client.print("Host: ");
		client.println(server);
		client.println("Content-Type: application/x-www-form-urlencoded");
		client.println("Connection: close");
		client.print("Content-Length: ");
		client.println(data.length());
		client.println();
		client.print(data);
		client.println();
		Serial.print("Enviat	 So = ");
		Serial.println(estat);
	}
	delay(1000);
	if (!client.connected()) {
		Serial.println();
		Serial.println("Desconnectant");
		client.stop();
	}
	client.stop();
	delay(1800000); // 30 minuts
}

L'aplicació feta amb App Inventor té quatre pantalles. La disposició d'elements a la primera pantalla és:

Pantalla

El programa és el següent:

Programa
Programa
Programa
Programa
Programa

La disposició d'elements a la segona pantalla és:

Pantalla

El programa és el següent:

Programa
Programa
Programa
Programa

La disposició d'elements a la tercera pantalla és:

Pantalla

El programa és el següent:

Programa
Programa

La disposició d'elements a la quarta pantalla és:

Pantalla

El programa és el següent:

Programa

 

 

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