OBJECTIU: Crear un detector de posta de sol mitjançant la comunicació inal·làmbrica de dues XBees.
Depenent de quina sigui la quantitat de llum rebuda per l'LDR s'interpretarà si és de dia, mitja tarda o nit. Amb això regularem la lluminositat d'un LED i a més a més es mostrarà per l'LCD en quin moment del dia estem.
Material necessari:
- Placa Arduino UNO
- Placa Protoboard (x2)
- XBees Explorer (x2)
- Digi XBee (x2)
- Cables connectors
- Resistència 22 kOhms
- LDR
- LED's (x3)
1. Muntatge del circuit
2. Codi
#include <FastIO.h> #include <I2CIO.h> #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <LiquidCrystal_SR.h> #include <LiquidCrystal_SR2W.h> #include <LiquidCrystal_SR3W.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); int LED_NIGHT=12; int LED_SUNSET=11; int LED_DAY=10; int debugLED=13; int analogValue=0; void setup(){ pinMode(LED_DAY, OUTPUT); pinMode(LED_SUNSET, OUTPUT); pinMode(LED_NIGHT, OUTPUT); pinMode(debugLED, OUTPUT); Serial.begin(9600); //LCD lcd.begin(16,2); } void loop(){ digitalWrite(LED_NIGHT,LOW); digitalWrite(LED_SUNSET,LOW); digitalWrite(LED_DAY,LOW); if(Serial.available()>=21){ // tot el que entri a partir d'aqui serà valid. if(Serial.read()==0x7E){ //Encén el LED per indicar quan es reben dades digitalWrite(debugLED, HIGH); delay(10); digitalWrite(debugLED,LOW);
// legeix les variables que no estem utilitzant
for (int i = 0; i<18; i++) { byte discard = Serial.read(); } int analogHigh = Serial.read(); int analogLow = Serial.read(); analogValue = analogLow + (analogHigh * 256); } } if(analogValue > 0 && analogValue <= 350){ digitalWrite(LED_NIGHT, HIGH); delay(10); digitalWrite(LED_NIGHT, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("MORNING"); // ‘MORNING’es mostra per pantalla } if(analogValue > 350 && analogValue <= 750){ digitalWrite(LED_SUNSET, HIGH); delay(10); digitalWrite(LED_SUNSET, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("AFTERNOON"); //‘AFTERNOON’es mostra per pantalla } if(analogValue>750 && analogValue<=1023){ digitalWrite(LED_DAY, HIGH); delay(10); digitalWrite(LED_DAY, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("NIGH"); // ‘NIGH’es mostra per pantalla } }
#include <FastIO.h> #include <I2CIO.h> #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <LiquidCrystal_SR.h> #include <LiquidCrystal_SR2W.h> #include <LiquidCrystal_SR3W.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); int LED_NIGHT=12; int LED_SUNSET=11; int LED_DAY=10; int debugLED=13; int analogValue=0; void setup(){ pinMode(LED_DAY, OUTPUT); pinMode(LED_SUNSET, OUTPUT); pinMode(LED_NIGHT, OUTPUT); pinMode(debugLED, OUTPUT); Serial.begin(9600); //LCD lcd.begin(16,2); } void loop(){ digitalWrite(LED_NIGHT,LOW); digitalWrite(LED_SUNSET,LOW); digitalWrite(LED_DAY,LOW); if(Serial.available()>=21){ // tot el que entri a partir d'aqui serà valid. if(Serial.read()==0x7E){ //Encén el LED per indicar quan es reben dades digitalWrite(debugLED, HIGH); delay(10); digitalWrite(debugLED,LOW);
// legeix les variables que no estem utilitzant
for (int i = 0; i<18; i++) { byte discard = Serial.read(); } int analogHigh = Serial.read(); int analogLow = Serial.read(); analogValue = analogLow + (analogHigh * 256); } } if(analogValue > 0 && analogValue <= 350){ digitalWrite(LED_NIGHT, HIGH); delay(10); digitalWrite(LED_NIGHT, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("MORNING"); // ‘MORNING’es mostra per pantalla } if(analogValue > 350 && analogValue <= 750){ digitalWrite(LED_SUNSET, HIGH); delay(10); digitalWrite(LED_SUNSET, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("AFTERNOON"); //‘AFTERNOON’es mostra per pantalla } if(analogValue>750 && analogValue<=1023){ digitalWrite(LED_DAY, HIGH); delay(10); digitalWrite(LED_DAY, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("NIGH"); // ‘NIGH’es mostra per pantalla } }
3. Demostració