Ma insomma dove sono tutti quegli utenti che compravano il raspberry :P
Dunque, ne segno altri due, uno effettivo e l'altro è in wip.
Il primo è una cosa molto easy, viene fatta con un raspberry pi 3 model b, raspbian ( pen'ultima versione, quella prima di buster per intenderci ), php, apache e arduino.
In camera mia ho un ventilatore da soffitto che funziona SOLO ed esclusivamente con un telecomando 433MHz, quidni se spengo la luce con l'interruttore della camera, gli tolgo totalmente l'alimentazione e ce l'ho in quel posto.
Così, a sbaffo dell'elettricista che diceva che era impossibile clonare il telecomando, mi sono clonato con arduino l'intero set di istruzioni del telecomando:
-5 velocità delle pale
-luce calda, fredda, mista
-intensità della luce
-luce accesa/spenta
-pale in funzione o no
Su arduino poi ho predisposto due cavi ( un - ed un + ) per la trasmissione dei dati con il raspberry ( usando il modulo 433MHz con raspberry, non fornendo i 5V, non dava i segnali giusti... ho tirato giù tutti i santi ).
Sul raspberry mi sono fatto una specie di web app in cui posso controllare questo ventilatore, e i comandi vengono fatti tramite php che esegue delle chiamate sul "cmd" per interagire con la serial port dell'arduino.
In soldoni ho usato apache per il server web, php per le chiamate tra raspberry/gpio/arduino, onsenui come interfaccia grafica.
Includo il codice di arduino ( che attenzione, è un progetto multiplo, infatti c'è collegato display lcd che mi segna temperatura ed ora, e tramite dei bottoni fisici posso accendere e spegnere la retroilluminazione del display. Il tutto per usare una specie di thread e quindi far fare più cose senza bloccare arduino )
C#:
#include "DHT.h"
#include <RCSwitch.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS1302.h>
#define DHTPIN 11
#define DHTTYPE DHT11
#define INTERVAL_MESSAGE1 1000
#define INTERVAL_MESSAGE2 2000
#define INTERVAL_MESSAGE3 11000
#define INTERVAL_MESSAGE4 13000
unsigned long time_1 = 0;
unsigned long time_2 = 0;
unsigned long time_3 = 0;
unsigned long time_4 = 0;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
RCSwitch mySwitch = RCSwitch();
DS1302 rtc(2, 3, 4);
String read_serial;
int SWITCH_BCK = 7;
int SWITCH_ONOFF = 6;
int val = 0;
int cmd = 0;
int val_tmp = 1;
void setup() {
rtc.halt(false);
rtc.writeProtect(false);
dht.begin();
lcd.init();
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
inizializzalcd();
mySwitch.enableTransmit(10);
mySwitch.setProtocol(6);
mySwitch.setPulseLength(389);
mySwitch.setRepeatTransmit(15);
pinMode(SWITCH_BCK, INPUT);
pinMode(SWITCH_ONOFF, INPUT);
}
void loop() {
if (millis() > time_1 + INTERVAL_MESSAGE1) {
time_1 = millis();
data ();
}
if (millis() > time_2 + INTERVAL_MESSAGE2) {
time_2 = millis();
temp();
}
val = digitalRead(SWITCH_BCK);
cmd = digitalRead(SWITCH_ONOFF);
delay(100);
if (cmd == HIGH) {
read_serial = "1";
delay(250);
}
if (val == HIGH && val_tmp == 0) {
val_tmp = 1;
lcd.setBacklight(HIGH);
delay(100);
} else if (val == HIGH && val_tmp == 1) {
val_tmp = 0;
lcd.setBacklight(LOW);
delay(100);
}
while (Serial.available()) {
char c = Serial.read();
read_serial += c;
delay(2);
}
if (read_serial.length() > 0) {
int n = read_serial.toInt();
Serial.print("--> ");
Serial.println(n);
switch (n) {
case 1:
//on/off lamp
mySwitch.send(2768297236, 32);
break;
case 2:
//on/off fan
mySwitch.send(3959479572, 32);
break;
case 3:
//LOW
mySwitch.send(1610669332, 32);
break;
case 4:
// MID
mySwitch.send(100719892, 32);
break;
case 5:
// HIGH
mySwitch.send(218160404, 32);
break;
case 6:
// LAMP MIN
mySwitch.send(4110474516, 32);
break;
case 7:
// LAMP MAX
mySwitch.send(1593892116, 32);
break;
case 8:
//1
mySwitch.send(4211137812, 32);
break;
case 9:
//2
mySwitch.send(4261469460, 32);
break;
case 10:
//3
mySwitch.send(1510006036, 32);
break;
case 11:
//4
mySwitch.send(4009811220, 32);
break;
case 12:
//5
mySwitch.send(3204504852, 32);
break;
case 13:
//REV
mySwitch.send(4244692244, 32);
break;
default:
Serial.print("DEF: ");
Serial.println(n);
break;
}
read_serial = "";
}
}
void data () {
lcd.setCursor(0, 0);
lcd.print(rtc.getDateStr());
lcd.print(" ");
lcd.print(rtc.getTimeStr());
}
void temp() {
float h = 0.0;
float t = 0.0;
h = dht.readHumidity();
t = dht.readTemperature();
lcd.setCursor(0, 1);
lcd.print("Oggi ");
lcd.print((int)t);
lcd.print((char)223);
lcd.print(" con ");
lcd.print((int)h);
lcd.print("%");
}
void inizializzalcd() {
lcd.setCursor(0, 0);
lcd.print("Inizializzo....");
//delay(250);
}
Il secondo progetto è un WIP nella mia testa:
Consisterà in una scatoletta elettrica con coperchio ricoperto di pannelli solari che alimenterà un gruppo di batterie per tenere in vita un raspberry w 0 ed alcuni sensori. Tutto che girerà su server linux e salvataggio dei dati ( devo ancora pensare quali xD ) su database o mysql o sqlite e reperibili da remoto + vari allert via email ( avevo in mente di far vedere lo stato della batteria, quanto è efficiente il pannello solare, quanti Watt ha accumulato, vari dati relativi al "server", e stavo pensando di monitorare l'inquinamento acustico )
Naturalmente tutto ancora nella mia testa, ma pian piano prende forma su carta xD