Per l'alimentazione solare ho usato un modulo basato su CN3065 per la ricarica della LiPo con una LiPo da 2000 mAh ed un pannello solare da 0.5W. I cavi sono stati saldati sulla piastra invece su usare i connettori JST (per la batteria ed il pannello solare ci sono sia i connettori JST che le basi per saldare...per l'output su SYS ho collegato i cavi dietro al JST)
Le connessioni sono piuttosto semplici
ADXL345 : il pin di interrupt e' collegato a D8 di MKR. Gli altri cavi sono 3.3V, GND SDA ed SCL in modo standard
Un problema che e' stato riscontrato e' che l'interrupt 1 dell'ADXL345 passa da uno stato High ad uno Low mentre la MKR si aspetta l'esatto contrario per attivare l'interrupt
Per questo motivo il collegamento tra INT1 di ADXL345 e D8 di MKR1400 passa attraverso un circuito di logic inverter (in pratica una porta NOT) realizzato con un transistor 2n2222a
Sull'IN e' stato collegato INT1 di ADXL345 e su out D8 di MKR
Circuito di prova...l'interrutore serve a simulare il cambio di stato del pin |
Il consumo in standby e' di circa 20 mA (mi aspettavo di meno...forse ho sbagliato qualcosa??)
mentre quando viene attivato il GSM e si invia l'SMS la corrente raggiunge un picco di circa 220 mA con valori stabili per una decina di secondi sopra i 100 mA
Questo e' lo sketch di funzionamento
----------------------------------------------------
#include "ArduinoLowPower.h"
#include <SparkFun_ADXL345.h>
#include <MKRGSM.h>
// Pin per wakeup
const int interruptPin = 8;
// GSM
GSM gsmAccess;
GSM_SMS sms;
ADXL345 adxl = ADXL345();
volatile int invia = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(interruptPin, INPUT);
delay(5000);
adxl.powerOn();
adxl.setRangeSetting(2);
adxl.setInterruptLevelBit(1);
adxl.setSpiBit(0);
adxl.setActivityXYZ(1, 1, 1);
adxl.setActivityThreshold(50);
adxl.setTapDetectionOnXYZ(1, 1, 1);
adxl.setTapThreshold(50);
adxl.setTapDuration(55);
adxl.ActivityINT(1);
adxl.singleTapINT(1);
LowPower.attachInterruptWakeup(interruptPin, funzione, CHANGE);
}
void loop() {
if (invia == 1){
bool connected = false;
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
while (!connected) {
if (gsmAccess.begin() == GSM_READY) {
connected = true;
}
delay(1000);
sms.beginSMS("+393471xxxxxx");
sms.print("Luca mi ha toccato");
sms.endSMS();
invia = 0;
}
}
LowPower.sleep();
}
void funzione() {
invia = 1;
}