Visualizzazione post con etichetta Electron. Mostra tutti i post
Visualizzazione post con etichetta Electron. Mostra tutti i post

mercoledì 30 gennaio 2019

SMS + DeepSleep + Interrupt in Particle Electron

Prendendo spunto dal post precedente in questo caso l'SMS e' inviato da una Particle Electron generato da un interrupt su pin D2 (in questo caso pero' mandando il pin a GND) partendo pero' da una condizione di Deep Sleep

===============================================================
#include "application.h"
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("TM", "", "", NULL));

const char* phNum = "+39347107xxxx";
const char* msg = "Interrupt fired";
int  ret;


void setup()
{
 pinMode(D7, OUTPUT);
 pinMode(D2, INPUT_PULLDOWN);    // sets pin as input
}

void loop()
    {
    digitalWrite(D7, HIGH);

    System.sleep(D2,FALLING);
    Cellular.on();
    Cellular.connect();
    delay(20000);
    if (Cellular.ready() == true)
    {
      ret = Cellular.command("AT+CMGF=1\r\n");
      ret = Cellular.command("AT+CMGS=\"%s%s\",129\r\n",(phNum[0] != '+') ? "+" : "", phNum); //
      ret = Cellular.command("%s\x1a", msg);
      digitalWrite(D7, LOW);
      delay(5000);

    }

}

Invio SMS da Particle Electron da interrupt

Come gestire gli interrupt fisici su Particle Electron ed inviare SMS
Al contratio di Arduino Uno sulla Electron ci sono molteplici pin che possono essere settati per ricevere un interrupt. In questo caso e' stato scelto il D2


Per atttivare l'interrupt viene mandata una corrente di 3.3V sul Pin D2 e viene settata una variabile volatile in modo che possa essere intercettata anche fuori dall'interrupt nella funzione loop. La gestione di invio inoltre non puo' essere gestita all'interno della funzione di interrupt

per la compilazione

particle compile electron interrupt.ino --saveTo interrupt.bin
particle flash --usb  interrupt.bin 

Nel video si osserva la procedura

----------------------------------------------------------------
#include "application.h"
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("TM", "", "", NULL));

const char* phNum = "+3934710xxxxx";
const char* msg = "Interrupt fired";
int  ret;
volatile bool invio;

void  IN4_ISR() {
      invio = true;
}

void setup()
{
  invio = false;
 pinMode(D7, OUTPUT);
 pinMode(D2, INPUT_PULLDOWN);    // sets pin as input
 attachInterrupt(D2, IN4_ISR, FALLING);  //RISING, FALLING, CHANGE
}

void loop()
    {
      if (invio)
      {
        digitalWrite(D7, HIGH);
        ret = Cellular.command("AT+CMGF=1\r\n");
        ret = Cellular.command("AT+CMGS=\"%s%s\",129\r\n",(phNum[0] != '+') ? "+" : "", phNum); //
        ret = Cellular.command("%s\x1a", msg);
        invio = false;
        delay(500);
        digitalWrite(D7, LOW);
      }

}

martedì 29 gennaio 2019

Electron Particle e SIM Mobile Things

Dopo un po' di tempo ho ripreso in mano la Electron Sparkle ed ho montato una scheda SIM di Things Mobile. Nel tempo peraltro e' andata persa l'antenna originale della confezione prodotta da Taoglass ed il dispositivo non puo' funzionare senza... ho preso questa antenna su Amazon come sostituzione


Per configurare la scheda con una SIM di terze parti si deve installare la parte CLI di Particle con

npm install --unsafe-perm --verbose -g particle-cli

(attenzione potrebbero esserci problemi nella compilazione della seriale)

particle update

Per effettuare il flash del firmware si deve premere RESET+MODE, poi rilasciare RESET e tenendo premuto MODE attendere che il led diventi giallo

Si deve scaricare il file Tinker.ino modificando l'APN che per Mobile Things e' TM

#include "cellular_hal.h"
STARTUP(cellular_credentials_set("TM", "", "", NULL));
ed impostando il KeepAlive

Queste righe dovranno essere comprese in ogni script che verra' caricato sul dispositivo

si compila quindi
particle compile electron tinker.ino --saveTo firmware.bin
particle flash --usb firmware.bin


Puo' essere necessario effettuare il claim del device ma prima si deve conoscere il seriale
Per effettuare l'identify si deve premere il pusante Mode fino a quando il led diventa blu.
A questo punto si lancia

particle identify

Ci si logga sul cloud
particle cloud login

e si efffettua il claim
particle device add device_ID


Per verificare che tutto sia andato a buon fine si puo' provare ad accendere il led blu da linea di comando con il comando (dove Geocell e' il nome mnemonico del dispositivo)

particle call Geocell digitalwrite D7,HIGH

per l'invio degli SMS Mobile Things non ha problemi ed e' sufficiente il seguente codice
-----------------------------------------------
const char* phNum = "+39347107xxxxx";
const char* msg = "Test message";
int  ret;

void setup() {
Serial.begin(115200);
ret = Cellular.command("AT+CMGF=1\r\n");
Serial.print("Return from message format = ");
Serial.println(ret);
ret = Cellular.command("AT+CMGS=\"%s%s\",129\r\n",(phNum[0] != '+') ? "+" : "", phNum); //
Serial.print("Return from phNum send = ");
Serial.println(ret);
ret = Cellular.command("%s\x1a", msg);
Serial.print("Return from message send = ");
Serial.println(ret);

}


void loop() {

}
--------------------------------------------------



venerdì 16 dicembre 2016

Ricarica solare per Particle Electron

La Particle Electron si puo' ricaricare con pannello solare tramite il pin VIN (con una tensione massima di 12 V) oppure dal connettore USB. Per quanto indicato dal sito il pannello solare deve erogare almeno 10 W altrimenti e' sempre necessario l'utilizzo di una LiPo (quindi per ricaricare la LiPo e' necessaria una potenza superiore ai 10 W)





Usando un pannello solare da 7W della Levin ed un ciclo di deep-sleep ed attivita' di circa 9 ad 1 e' stato verificata una ricarica di circa il 5% della batteria da 2000 mAh in circa un'ora di insolazione (la prova e' stata quindi sospesa per l'arrivo di copertura nuvolosa)










giovedì 15 dicembre 2016

ThingSpeak con Particle Electron

Per pubblicare i dati di Particle Electron puo' essere utile il servizio Thingspeak

E' possibile registrarsi con un profilo gratuito per le prove.

Esempio di pubblicazione dati ThingSpeak

Per prima cosa si deve registrare il proprio canale a cui sara' associata una API Key per la scrittura dei dati





in seguito si devono impostare le variabili da visualizzare nei grafici




per utilizzare ThingSpeak nel firmware si deve modificare il programma (vedi righe evidenziate in giallo)  importando la libreria, impostando poi il proprio numero di canale e la WriteAPIKey, inizializzare il client e poi pubblicare i valori (le variabili non hanno un nome ma sono indicate con un numero progressivo nello stesso ordine con cui sono state configurate nella schermata web)

------------------------------------
#include "cellular_hal.h"
#include "ThingSpeak/ThingSpeak.h"

STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));

int status;
int counter = 0;
double batteria = 0.0;
int sleepInterval = 10; //Specify minutes between each reading sent

int analogPin0 = A0;
double mm = 0.0;

/* Thingspeak */
TCPClient client;
unsigned long myChannelNumber = 203125;
const char * myWriteAPIKey = "4MHFO3D4XXXXXXXX";

void fuel()
{
    FuelGauge fuel;
    batteria = static_cast<double>(fuel.getSoC());
    mm = analogRead(analogPin0);
}

void connect_status()
{
        RGB.control(false);
        Cellular.on();
        Cellular.connect();
        delay(10000);
        Particle.connect();
        //waitUntil(Particle.connected);
        delay(20000);
        Particle.connect();
        while(status < 3)//send one reading
        {
            if(Cellular.ready() && Particle.connected() == true)
                {
                    delay(10000);
                    fuel();
                    ThingSpeak.setField(1, (float)batteria);
                    ThingSpeak.setField(2, (float)mm);

                    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

                    if(Particle.publish("batteria", "batteria") == true)
                    {
                        delay(10000);
                        status++;
                    }
                    else if(Particle.publish("batteria", "batteria") == false)
                    { 
                        Cellular.on();
                        Cellular.connect();
                        delay(20000);
                        Particle.connect();
                        status=status -1;
                        delay(20000);
                    }
                }
            else
            {
                Cellular.on();
                Cellular.connect();
                delay(10000);
                Particle.connect();
                status=0;
                delay(10000);
            }
        }
        
}

void setup() {
    Time.zone(+1);
    RGB.control(false);
    Particle.variable("batteria", &batteria, DOUBLE);
    ThingSpeak.begin(client);

}


void loop() {
RGB.control(false);


if(counter == 0)
{
    delay(5000);
    fuel();
    Particle.publish("batteria", "batteria");
    delay(5000);
    counter =1;
  
}

System.sleep(D0, RISING, sleepInterval * 60); //Puts device in stop mode 

delay(1500);

status=0;

connect_status();

}

mercoledì 14 dicembre 2016

Particle Electron Sleep Mode


Dopo il precedente post ho provato ad utilizzare le funzioni di risparmio energietico di Particle Electron in modo da massimizzare il tempo di durata della batteria

Nel precedente tentativo la batteria (da 2000 mAh) si esauriva dopo circa 24 ore



Usando la modalita' di sleep e spengendo l'apparato di trasmissione cellulare pur inviando un dato ogni 10 minuti (vedi grafico sottostante) l'autonomia e' passata ad oltre 4 giorni (piu' precisamente 4.3)


utilizzando un risparmio piu' aggressivo (tipo un dato ogni ora) si puo' tranquillamente superare una settimana di autonomia in sola alimentazione da batteria per arrivare a quasi un mese utilizzando batterie piu' capienti.

---------------------------------------
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("ibox.tim.it", "", "", NULL));

int status;
int counter = 0;
double batteria = 0.0;
int sleepInterval = 10; //Specify minutes between each reading sent


void fuel()
{
    FuelGauge fuel;
    batteria = static_cast<double>(fuel.getSoC());
}

void connect_status()
{
        RGB.control(false);
        Cellular.on();
        Cellular.connect();
        delay(10000);
        Particle.connect();
        //waitUntil(Particle.connected);
        delay(20000);
        Particle.connect();
        while(status < 3)//send one reading
        {
            if(Cellular.ready() && Particle.connected() == true)
                {
                    delay(10000);
                    fuel();
                    if(Particle.publish("batteria", "batteria") == true)
                    {
                        delay(10000);
                        status++;
                    }
                    else if(Particle.publish("batteria", "batteria") == false)
                    { 
                        Cellular.on();
                        Cellular.connect();
                        delay(20000);
                        Particle.connect();
                        status=status -1;
                        delay(20000);
                    }
                }
            else
            {
                Cellular.on();
                Cellular.connect();
                delay(10000);
                Particle.connect();
                status=0;
                delay(10000);
            }
        }
        
}

void setup() {
    Time.zone(+1);
    RGB.control(false);
    Particle.variable("batteria", &batteria, DOUBLE);
}


void loop() {
RGB.control(false);


if(counter == 0)
{
    delay(5000);
    fuel();
    Particle.publish("batteria", "batteria");
    delay(5000);
    counter =1;
  
}

System.sleep(D0, RISING, sleepInterval * 60); //Puts device in stop mode 

delay(1500);

status=0;

connect_status();

}
---------------------------------------

venerdì 9 dicembre 2016

Particle Electron

Qualche tempo fa avevo provato la Particle Photon, adesso e' il turno di Particle Electron

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 la programmazione si puo' utilizzare la modalita' cloud ma qualunque errore puo' essere pagato con la perdita con la connessione del dispositivo. La cosa piu' semplice e' programmare Electron via USB.

Per prima cosa si deve scaricare particle-cli via npm

npm install -g particle-cli
e poi ci si connette al cloud

particle cloud login

(nonostante si usi particle-cli e' necessaria comunque la connessione di rete perche' la compilazione avviene sempre sul cloud di particle)

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
-----------------------------------

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


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...