Un sistema Multisensoriale per la Smart Home – Parte 2

Nell’articolo “Un sistema Multisensoriale per la Smart Home – Parte 1” abbiamo descritto i componenti del progetto Multisensore, il funzionamento del circuito e come realizzarlo utilizzando lo schema elettrico riportato nella Figura 4 dell’articolo Parte 1. Abbiamo installato nella scheda D1 Mini il driver del chip CH340 e alcune librerie di gestione dei sensori, infine, abbiamo testato il funzionamento del modulo D1 Mini mediante il programma di esempio Blink.

Verificata con successo l’esecuzione del programma Blink, abbiamo la certezza che la scheda D1 Mini funziona correttamente, quindi possiamo procedere con la programmazione del modulo D1 Mini caricando il codice ESP8266_Multisensor_Shield.ino. Dall’editor di Arduino, aprite un nuovo sketch e copiate il codice seguente:

/***************** ESP8266_Multisensor_Shield.ino ********/

/***************** ESP8266_Multisensor_Shield.ino ********/
// Load libraries
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Replace with your network credentials
const char* ssid     = "IL TUO SSID";
const char* password = "LA TUA PASSWORD";

// Auxiliary variables for temperature
static char celsiusTemp[7];
static char fahrenheitTemp[7];
String temperatureString = "";
      
// Variable to hold the temperature reading

// EEPROM size
// Address 0: Last output state (0 = off or 1 = on)
// Address 1: Selected mode (0 = Manual, 1 = Auto PIR,
// 2 = Auto LDR, or 3 = Auto PIR and LDR)
// Address 2: Timer (time 0 to 255 seconds)
// Address 3: LDR threshold value (luminosity in percentage 0 to 100%)
#define EEPROM_SIZE 4

// Set GPIOs for: output variable, status LED, PIR Motion Sensor, and LDR
const int output = 15;
const int statusLed = 12;
const int motionSensor = 5;
const int ldr = A0;
// Store the current output state
String outputState = "off";

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;          
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

// Timers - Auxiliary variables
unsigned long now = millis();
unsigned long lastMeasure = 0;
boolean startTimer = false;
unsigned long currentTime = millis();
unsigned long previousTime = 0; 
const long timeoutTime = 2000;

// Auxiliary variables to store selected mode and settings 
int selectedMode = 0;
int timer = 0;
int ldrThreshold = 0;
int armMotion = 0;
int armLdr = 0;
String modes[4] = { "Manual", "Auto PIR", "Auto LDR", "Auto PIR and LDR" };

// Decode HTTP GET value
String valueString = "0";
int pos1 = 0;
int pos2 = 0;
// Variable to store the HTTP request
String header;
// Set web server port number to 80
WiFiServer server(80);

void setup() {
// Start the DS18B20 sensor
sensors.begin();

// Serial port for debugging purposes
Serial.begin(115200);

// PIR Motion Sensor mode, 
then set interrupt function and RISING mode
pinMode(motionSensor, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(motionSensor), 
detectsMovement, RISING);
  
Serial.println("start...");
EEPROM.begin(EEPROM_SIZE);
  
// Uncomment the next lines to test the values stored in the flash memory
/*Serial.println(" bytes read from Flash . Values are:");
for(int i = 0; i < EEPROM_SIZE; i++) {
Serial.print(byte(EEPROM.read(i))); 
Serial.print(" ");
}*/
  
// Initialize the output variable and the LED as OUTPUTs
pinMode(output, OUTPUT);
pinMode(statusLed, OUTPUT);
digitalWrite(output, HIGH);
digitalWrite(statusLed, LOW);
// Read from flash memory on start 
and store the values in auxiliary variables
// Set output to last state (saved in the flash memory)
if(!EEPROM.read(0)) {
outputState = "off";
digitalWrite(output, HIGH);
}
else {
outputState = "on";
digitalWrite(output, LOW);
}
selectedMode = EEPROM.read(1);
timer = EEPROM.read(2);
ldrThreshold = EEPROM.read(3);
configureMode();
  
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}

void loop() {
WiFiClient client = server.available();   
// Listen for incoming clients
if (client) {                             
// If a new client connects,
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client.");          
// print a message out in the serial port
String currentLine = "";                
// make a String to hold incoming data from the client
while (client.connected() && currentTime-previousTime <= timeoutTime) 
{ 
 [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2697 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend