Intellekten Galileo-väderstation (4 / 5 steg)
Steg 4: Ladda upp och konfigurera kod
- Öppna weather_to_led.ino i din Arduino IDE och konfigurera efter saker
- LED-portar (The PWM hamnar i din styrelse är markerade med en [ ~ ])
- Knappen port
- Insomningstid
- Kanske ändra skriptet och config filen sökväg
- Öppna mail.py via ssh. Ändra sedan de 6 variabler som definierats på toppen av skriptet
- SMTPServerUrl är adressen till din SMTP-server
- SMTPServerPort är portnumret för SMTP-servern
- SMTPUsername är användarnamnet för kontot
- SMTPPassword är lösenordet till ditt e-postkonto
- EmailAddress är e-postadressen till ditt e-postkonto
- Ämnet är föremål för den post som skickas av detta skript
- Obs: Anslutningen är inte RF. Information är inte krypterade
- Öppna config.txt via ssh. Config systemet förklaras i följande codeblock:
CITY_NAME_LED
CITY_NAME1; MIN_TEMP; MAX_TEMP; MIN_CLOUDS; MAX_CLOUDS; MIN_RAIN; MAX_RAIN; MEDDELANDE; E-POST;
CITY_NAME2;...
[...]
[TOM RAD]
- CITY_NAME_LED är namnet på staden vars väder ska visas via lysdioder.
- Varje följande rad anger ett meddelande som ska skickas till den e-post de givna förutsättningar * enligt väderdata hämtas från staden definieras på raderna börjar. (CITY_NAME1 i kodblocket)
- Temperaturen mäts i Celsius, molnen i procent (0% = blå himmel) och regn mäts i mm per kvadratmeter, minskat under de senaste 3 timmarna.
* Det innebär att för varje uppmätt värde x bör MIN_VALUE < = x och x < = MAX_VALUE.
weather_to_led.ino:
#define MAX_MESSAGE_LENGTH 128
#define MAX_CITY_LENGTH 20
#define MAX_COMMAND_LENGTH (MAX_CITY_LENGTH + 30)
#define MAX_MAILADDR_LENGTH 30
#define SLEEP_TIME 3600
#define LOOP_DELAY 250
#define BUTTON_PIN 2
char SCRIPT_FILE [] = "/ home/root/weather.py";
char CONFIG_FILE [] = "/ home/root/config.txt";
char MAIL_FILE [] = "/ home/root/mail.py";
/*
* Innehåller de IO portnummer för en RGB-LED. Vi använder portar med
* PWM att blanda färger.
* Port 0 innebär detta LED inte används eller ansluten.
*/
struct RGB_LED {
int röda;
int grönt;
int blå;
};
/*
* Förklaring av våra 3 används led's. Varje använder endast två portar. Så vi
* är ansluta tre ledde 's till 6 PWM portar.
*/
struct RGB_LED temp = {3, 0, 5};
struct RGB_LED regn = {0, 6, 9};
struct RGB_LED moln = {0, 10, 11};
struct väder {
float härda;
float moln;
float regn;
};
/*
* Gör en ledde. Därtill pinmode ist inställd
* utgång.
* led struct med portnummer
*/
void init_rgb_led (struct RGB_LED ledde) {
Ange var ledde hamn till utgång
om (led.red! = 0) pinMode (led.red, produktionen);
om (led.green! = 0) pinMode (led.green, produktionen);
om (led.blue! = 0) pinMode (led.blue, produktionen);
Switch ledde är off
set_rgb_led ledde (, 0, 0, 0);
}
/*
* Anger färg på en specifik ledde. Vi använder analogWrite och PWM till
* Blanda färgerna.
* Det ledde strukt bör ha initierats före.
* led struct med portnummer och r, g, b värden, som bör vara
* set
*/
void set_rgb_led (struct RGB_LED ledde, int r, int g, int b) {
Skriver de givna värdena på våra portar. Värdet måste vara inverterad,
orsakas av vår konstruktion.
om (led.red! = 0) analogWrite (led.red, 255 - r);
om (led.green! = 0) analogWrite (led.green, 255 - g);
om (led.blue! = 0) analogWrite (led.blue, 255 - b);
}
/*
* Ges en temperatur i celsius visar denna funktion värdet
* genom att blanda rätt färger tillsammans.
* grader från 0 till 25
*/
void set_temp (int grad) {
int värde;
Skala: 0 < = examen < = 25
om grad (grad > 25) = 25;
om grad (grad < 0) = 0;
Beräkna värdet LED. (25 * 1
värde = examen * 10;
Röd led var till ljust. Så dess värde är delat med 2
set_rgb_led (temp, värde/2, 0, 255 - värde);
}
/*
* Ges en propability denna funktion
* Visar värdet genom att blanda rätt färger tillsammans.
* propability som värde från 0 till 100
*/
void set_rain (int procent) {
int värde;
Acceptera endast värden mellan 0 och 100 grader
om (procent > 100) procent = 100;
om (procent < 0) procent = 0;
värde = (procent * 255) / 100;
set_rgb_led (regn, 0, 255 - värde, värde);
}
/*
* Ges en propability denna funktion
* Visar värdet genom att blanda rätt färger tillsammans.
* propability som värde från 0 till 100
*/
void set_clouds (int procent) {
int värde;
om (procent > 100) procent = 100;
om (procent < 0) procent = 0;
värde = (procent * 255) / 100;
set_rgb_led (moln, värde, värde, 255 - värde); Ruttna durch Verdratung
}
/*
* Denna funktion använder ett python-skript för att skicka ett meddelande till en viss e-postadress
* inklusive nuvarande väder informationer.
*
* meddelande är en pekare till våra Meddelandesträngen
* w är ett väder struct som innehåller aktuella informationer
* mailaddr är en pekare till våra mål e-strängen
*/
char send_weather_mail (char * meddelande, struct väder w, char * mailaddr) {
Fil * fp;
char buf [1024];
Förbereda en stor sträng, som innehåller kommandot
om (snprintf (buf, 1024,
"python2.7 %s '%s'" nya väder informations:\n%s\n\nCurrent Väder: \nTemperature: %.1fC\nRaining: % dmm (sista 3 h) \nClouds: %d %%'",
MAIL_FILE, mailaddr, meddelande, w.temp, w.rain, w.clouds) < = 0) {
Return 0;
}
Öppna en pipa och kör kommandot
FP = popen (buf, "r");
om (fp == NULL) {
Return 0;
}
Nästa stänga den
om (pclose(fp)! = 0) {
Return 0;
}
tillbaka 1.
}
/*
* Med tanke på en stad och ett väder struct, läser denna metod
* aktuella vädret värden och fyller strukt med dessa.
* Namnet på en stad som sträng
* Pekare till en väder struct
*
* 0 på misslyckande och annars är det en framgång
*/
int readWeather (char * stad, struct väder * w) {
Fil * fp;
char buf [MAX_COMMAND_LENGTH + 1];
Bygga kommandosträngen som, genom att addera sökväg och staden
om (snprintf (buf, (MAX_COMMAND_LENGTH + 1) * sizeof(char), "python2.7 %s '%s'",
SCRIPT_FILE, stad) < = 0) {
Return 0;
}
/ * Kör python skript och skriva allt i ett rör
* så vi kan läsa resultatet * /
FP = popen (buf, "r");
om (fp == NULL) return 0;
Läs aktuella väder värden
int erg = fscanf (fp, "% f\n%f\n%f", och (w -> temp), & (w -> clouds), & (w -> regn)) == 3.
Nära röret och kontrollera returvärdet
om (pclose(fp)! = 0) {
Return 0;
}
returnera erg;
}
/*
* Standard installationsmetoden för Arduino
*/
void setup() {
int i;
Pullup motstånd -> negerade logik
pinMode (BUTTON_PIN, INPUT_PULLUP);
Ange baudvärde för felsökning
Serial.BEGIN(9600);
Initiera våra 3 RGB-lysdioder
init_rgb_led(temp);
init_rgb_led(Rain);
init_rgb_led(Clouds);
Testa våra led genom att visa en animering
för (jag = 0; jag < = 100; i ++) {
set_temp(i / 4);
Delay(10);
}
för (jag = 0; jag < = 100; i ++) {
set_rain(i);
Delay(10);
}
för (jag = 0; jag < = 100; i ++) {
set_clouds(i);
Delay(10);
}
}
/*
* Uppdateringar väderinformation.
* onlyLeds gör vad det låter som ;)
*/
void updateEverything (bool onlyLeds) {
struct Väder Väder;
Fil * fd;
char staden [MAX_CITY_LENGTH + 1];
char mailaddr [MAX_MAILADDR_LENGTH + 1];
char meddelande [MAX_MESSAGE_LENGTH + 1];
int min_tmp, max_tmp, min_rain, max_rain, min_clouds, max_clouds;
Öppna konfigurationsfilen
fd = fopen (CONFIG_FILE, "r");
Felhantering
om (fd == NULL) {
Serial.println ("kunde inte hitta/öppna konfigurationsfilen! \n");
Sleep(SLEEP_TIME);
hemkomst.
}
Först läsa standart LED stadsnamnet
om (fscanf (fd, "%s\n", stad) == 1) {
Utskriftsnamn för felsökning
Serial.println(City);
om (readWeather (stad, och väder)) {
Skriva ut värden för felsökning
Serial.println(Weather.Temp);
Serial.println(Weather.Clouds);
Serial.println(Weather.Rain);
Uppdatera LED-färger
set_temp(Weather.Temp);
set_clouds(Weather.Clouds);
set_rain(Weather.Rain);
} annat {
Serial.println ("fel vid läsning av vädret! \n");
}
} annat {
Serial.println ("Konnte Stadt nicht lesen! \n");
}
Läsa konfigurationsfilen, tills det slutar
medan (! feof(fd) & &! onlyLeds) {
Försök att läsa en rad och tolka det
om (fscanf (fd, "% [^;]; %d %d %d; %d; %d; %d; % [^;]; %[^;];\ n", stad, & min_tmp, och max_tmp,
& min_clouds & max_clouds, & min_rain & max_rain, meddelande, mailaddr) == 9) {
Skriva ut staden för felsökning
Serial.println(City);
om (readWeather (stad, och väder)) {
Skriva ut värden för felsökning
Serial.println(Weather.Temp);
Serial.println(Weather.Clouds);
Serial.println(Weather.Rain);
Kolla våra villkor för att ge ett meddelande
om (min_tmp < = weather.temp & & weather.temp < = max_tmp & &
min_clouds < = weather.clouds & & weather.clouds < = max_clouds & &
min_rain < = weather.rain & & weather.rain < = max_rain) {
Skriva ut meddelandet
Serial.println(Message);
Skicka ett mail
om (! send_weather_mail (meddelande, väder, mailaddr)) {
Serial.println ("fel vid sändning av meddelande! \n");
}
}
} annat {
Serial.println ("fel vid läsning av vädret! \n");
}
} annat {
Serial.println ("fel vid läsning config filen!");
}
}
Stäng filen och vänta tills du trycker på knappen
fclose(fd);
}
void loop() {
statisk int loop_count = 1000 * SLEEP_TIME; Så är det executet början
om (loop_count > = 1000 * SLEEP_TIME) {
updateEverything(0);
loop_count = 0;
}
om (digitalRead(BUTTON_PIN) == låg) {
Switch ledde är off
set_rgb_led (temp, 0, 0, 0);
set_rgb_led (moln, 0, 0, 0);
set_rgb_led (regn, 0, 0, 0);
updateEverything(1);
}
loop_count += LOOP_DELAY;
Delay(LOOP_DELAY);
}