Il progetto due prevede un sistema ad alimentazione solare con una Arduino MKR1400 collegata ad un accelerometro ADXL345 che invia un SMS nel momento in cui il sensore registra un movimento
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 |
Per la versione finale sara' usato l'integrato
SN74HC04N, un integrato con 6 porte NOT a tensioni tra 2 e 6V
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;
}