La principale differenza e' che Photon e' basata su una comunicazione WiFi mentre Electron utilizza una connessione GSM mediante una SIM
L'altro aspetto interessante e' che la Electron puo' essere alimentata da una batteria LiPo e sulla scheda c'e' anche l'elettronica per ricaricare la batteria sia dal connettore Vin che da USB
Electron Pinout |
Per prima cosa si deve scaricare particle-cli via npm
npm install -g particle-cli
e poi ci si connette al cloud
a questo punto mediante la Ide Web di Particle si crea il programma.
Attenzione: se si hanno piu' dispositivi si deve cliccare sulla colonna di destra al menu devices e selezionare quella che si vuole utilizzare
Il dispositivo predefinito e' quello con il simbolo delle stella. Si deve anche annotare il Device ID (servira' in seguito)
A questo punto si deve scaricare dal cloud il programma compilato. Si clicca quindi sulla colonna di destra il menu Code (con il simbolo <>) e si clicca la nuvola vicino al nome del programma
Si scarica quindi un file denominato firmware.bin
Per effettuare l'upload si deve prima impostare la Electron in listening mode (luce blu pulsante, si deve premere per tre secondi il pulsante MODE sulla scheda) e poi si digita il comando
particle flash --serial firmware.bin
le variabili possono essere lette tramite cloud tramite la sintassi
https://api.particle.io/v1/devices/ID_DEVICE/nome_variabile?access_token=ACCESS_TOKEN
(sostituire le parti in giallo con i corretti valori)
La scheda viene venduta con una SIM preinstallata con un traffico a pacchetti prepagato. Si puo' comunque utilizzare qualsiasi scheda SIM dotata di traffico dati (questa operazione puo' risultare piu' conveniente rispetto al contratto fornito da Particle) basta impostare nel programma in giusto APN con la sintassi. Nell'esempio sottostante una configurazione per TIM
---------------------------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));
---------------------------------------------------------
particolare attenzione deve essere posta al colore del LED sulla scheda perche' e' da questo che si evidenzia se si ha la connessione di rete o meno
Un altro aspetto molto comodo di Electron e' quello di poter monitorare lo stato di carica della batteria LiPo mediante il comando
-----------------------------------
FuelGauge fuel;
double batteria = 0.0;
batteria = static_castz<double>(fuel.getSoC()); //attenzione che SoC e' scritto con la o centrale minuscola
-----------------------------------
FuelGauge fuel;
double batteria = 0.0;
-----------------------------------
L'utilizzo del cavo seriale permette anche di poter visualizzare i dati inviati lungo la seriale
In modo del tutto analogo di Arduino si puo' scrivere nel codice
-----------------------------------
void setup(){
Serial.begin(9600);
Serial.println("Luca");
}
-----------------------------------
le informazioni possono essere visualizzati in qualsiasi programma di monitor seriale.
Un altro bonus, soprattutto per il risparmio della batteria, e' la possibilita' di spengere ed accendere via software la componente radio
------------------------------------
Cellular.on();
delay(1000);
Cellular.connect();
While Cellular.ready()
{
}
delay(1000);
Cellular.off();
------------------------------------
un esempio di un programma funzionante con la lettura della porta analogica A0 e la trasmissione dei dati della porta e la carica della LiPo
------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));
double lettura = 0.0;
double mm = 0.0;
double batteria = 0.0;
int analogPin0 = A0;
FuelGauge fuel;
void setup(){
Particle.variable("lettura", &lettura, DOUBLE);
Particle.variable("mm", &mm, DOUBLE);
Particle.variable("batteria", &batteria, DOUBLE);
Serial.begin(9600);
}
void loop(){
lettura = analogRead(analogPin0);
mm = (lettura/4096)*50;
batteria = static_castz<double>(fuel.getSoC())
Particle.publish("lettura", "lettura");
Particle.publish("mm", "mm");
Particle.publish("batteria","batteria");
Serial.println(batteria);
delay(1000);
}
TimeOut Error
Attenzione : utilizzando una scheda SIM differente da quella fornita da Particle si puo' riscontrare il seguente errore dopo pochi minuti di uso della scheda e dello sketch sopra riportato
per ovviare a questo problema il programma sopra riportato deve essere modificato con una funzione di keep alive
-----------------------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));
double lettura = 0.0;
double mm = 0.0;
double batteria = 0.0;
int analogPin0 = A0;
long previousMillis = 0;
long interval = 40000;
FuelGauge fuel;
void setup(){
Particle.variable("lettura", &lettura, DOUBLE);
Particle.variable("mm", &mm, DOUBLE);
Particle.variable("batteria", &batteria, DOUBLE);
}
void loop(){
keep_alive();
}
void keep_alive()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
if (Particle.connected())
{
lettura = analogRead(analogPin0);
mm = (lettura/4096)*50;
batteria = static_cast<double>(fuel.getSoC());
Particle.publish("lettura", "lettura");
Particle.publish("mm", "mm");
Particle.publish("batteria","batteria");
}
}
}
-----------------------------------------------------
Consumi
da un breve test fatto con una batteria LiPo da 2000 mAh si ha un consumo del 5% di batteria circa ogni 90 minuti
Cellular.off();
------------------------------------
un esempio di un programma funzionante con la lettura della porta analogica A0 e la trasmissione dei dati della porta e la carica della LiPo
------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));
double lettura = 0.0;
double mm = 0.0;
double batteria = 0.0;
int analogPin0 = A0;
FuelGauge fuel;
void setup(){
Particle.variable("lettura", &lettura, DOUBLE);
Particle.variable("mm", &mm, DOUBLE);
Particle.variable("batteria", &batteria, DOUBLE);
Serial.begin(9600);
}
void loop(){
lettura = analogRead(analogPin0);
mm = (lettura/4096)*50;
batteria = static_castz<double>(fuel.getSoC())
Particle.publish("lettura", "lettura");
Particle.publish("mm", "mm");
Particle.publish("batteria","batteria");
Serial.println(batteria);
delay(1000);
}
TimeOut Error
Attenzione : utilizzando una scheda SIM differente da quella fornita da Particle si puo' riscontrare il seguente errore dopo pochi minuti di uso della scheda e dello sketch sopra riportato
per ovviare a questo problema il programma sopra riportato deve essere modificato con una funzione di keep alive
-----------------------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));
double lettura = 0.0;
double mm = 0.0;
double batteria = 0.0;
int analogPin0 = A0;
long previousMillis = 0;
long interval = 40000;
FuelGauge fuel;
void setup(){
Particle.variable("lettura", &lettura, DOUBLE);
Particle.variable("mm", &mm, DOUBLE);
Particle.variable("batteria", &batteria, DOUBLE);
}
void loop(){
keep_alive();
}
void keep_alive()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
if (Particle.connected())
{
lettura = analogRead(analogPin0);
mm = (lettura/4096)*50;
batteria = static_cast<double>(fuel.getSoC());
Particle.publish("lettura", "lettura");
Particle.publish("mm", "mm");
Particle.publish("batteria","batteria");
}
}
}
-----------------------------------------------------
Consumi
da un breve test fatto con una batteria LiPo da 2000 mAh si ha un consumo del 5% di batteria circa ogni 90 minuti