Inizio riprendendo questo vecchio topic da cui sono partito QUI e ricapitolo velocemente:
- Posseggo due codici utili per realizzare un progetto che ho in mente. I due codici funzionano perfettamente se testati separatamente, e sono stati provati decine e decine di volte (ripeto separatamente).
- Il problema nasce nel momento in cui vado a scriverli nello stesso sketch affinché possa caricare su Arduino un unico programma che funzioni simultaneamente.
- Inizialmente lavoravo con Arduino Uno e con due librerie che (come si è potuto concludere nel topic che ho linkanto sopra) entravano in conflitto tra loro. Ora (sempre come consigliatomi nel topic linkato sopra) sto lavorando con Arduino Mega cosicché da avere più pin con interrupt (di cui ho bisogno come potrete capire dai codici).
Questo è il primo sketch:
//SKETCH 1
int sensoreFlusso = 21; //Piedino di ingresso del flussostato
double flusso; //Quantità di acqua che scorre
volatile int count; //Variabile di conteggio
int ledErrore = 4;
void setup() {
pinMode (sensoreFlusso, INPUT); //Imposta piedino 2 in ingresso
pinMode (ledErrore, OUTPUT);
attachInterrupt (2, impulso, RISING); //Configura interrupt 0 pin 2
Serial.begin (9600); //Velocità seriale
}
void loop() {
count = 0; //Resetta il conteggio
interrupts(); //Abilita gli interrupt
delay (1000); //Pausa di 1 secondo
noInterrupts(); //Disabilita gli interrupt
flusso = (count * 2.25); //2.25mL per ogni impulso
flusso = flusso * 60; //Trasforma i secondi in minuti
flusso = flusso / 1000; //Trasforma i mL in litri
Serial.print ( "FLUSSO = ");
Serial.println (flusso); //Scrive a schermo la variabile flusso
if (flusso < 0.05)
{
digitalWrite (ledErrore, HIGH);
}
else
{
digitalWrite (ledErrore, LOW);
}
}
void impulso() {
count = count + 1; //Incrementa count di 1
}
Questo è il secondo sketch:
//SKEETCH 2
#include <GSM.h>
// ITA: Inizializzazione delle librerie
// ENG: Initialize the library instances
GSM gsmAccess;
GSM_SMS sms;
// ITA: Assegno i pin ai led
int rele = 8;
int ledConnessione = 12;
void setup()
{
// ENG: Setup pins for OUTPUT
// ITA: Imposto i pin come OUTPUT
pinMode(ledConnessione, OUTPUT);
boolean connessione = true;
// ITA: Attivo la connessione GSM
// ENG: Start GSM connection
while (connessione)
{
if (gsmAccess.begin() == GSM_READY)
connessione = false;
}
// ENG: GSM initialized
// ITA: Il GSM è pronto per ricevere messaggi
digitalWrite(ledConnessione, HIGH);
}
//ENG: Variable declaration
//ITA: Dichiarazione variabili
int i = 0;
char vettore[10];
char ricevuto[10];
String accendi = "On";
String spegni = "Off";
String casting;
void loop()
{
char c;
//ITA: COntrollo se ci sono messaggi
//ENG: If there are any SMSs available
if (sms.available())
{
//ITA: Lettura sms
//ENG: Read message
while (c = sms.read())
{
digitalWrite (ledConnessione, HIGH);
delay (200);
digitalWrite (ledConnessione, LOW);
delay (200);
Serial.print(c);
vettore[i] = c;
i++;
}
digitalWrite (ledConnessione, HIGH);
delay (200);
digitalWrite (ledConnessione, LOW);
delay (200);
digitalWrite(ledConnessione, HIGH);
for (int j = 0; j < i; j++)
ricevuto[j] = vettore[j];
casting = String(ricevuto);
if (casting.equals(accendi))
{
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH);
i = 0;
pulisciStringa(ricevuto, 10);
}
if (casting.equals(spegni))
{
pinMode(rele, OUTPUT);
digitalWrite(rele, LOW);
i = 0;
pulisciStringa(ricevuto, 10);
}
i = 0;
pulisciStringa(ricevuto, 10);
// ITA: Cancello i messaggi dalla memoria
// ENG: Delete message from modem memory
sms.flush();
}
delay(1000);
}
void pulisciStringa(char* tmp, int dim)
{
int x;
for (x = 0; x < dim; x++)
tmp[x] = 0;
tmp[0] = '\0';
}
Questo è il programma completo che vorrei far funzionare, nonché unione dei due precedenti:
#include <GSM.h>
GSM gsmAccess;
GSM_SMS sms;
int sensoreFlusso = 21;
int ledErrore = 4;
int rele = 8;
int ledConnessione = 12;
void setup()
{
pinMode (sensoreFlusso, INPUT);
pinMode (ledErrore, OUTPUT);
attachInterrupt (2, impulso, RISING);
Serial.begin (9600);
pinMode(ledConnessione, OUTPUT);
boolean connessione = true;
while (connessione)
{
if (gsmAccess.begin() == GSM_READY)
connessione = false;
}
digitalWrite(ledConnessione, HIGH);
}
void loop ()
{
pompa();
flussometro();
}
int i = 0;
char vettore[10];
char ricevuto[10];
String accendi = "On";
String spegni = "Off";
String casting;
void pompa()
{
char c;
if (sms.available())
{
while (c = sms.read())
{
digitalWrite (ledConnessione, HIGH);
delay (200);
digitalWrite (ledConnessione, LOW);
delay (200);
Serial.print(c);
vettore[i] = c;
i++;
}
digitalWrite (ledConnessione, HIGH);
delay (200);
digitalWrite (ledConnessione, LOW);
delay (200);
digitalWrite(ledConnessione, HIGH);
for (int j = 0; j < i; j++)
ricevuto[j] = vettore[j];
casting = String(ricevuto);
if (casting.equals(accendi))
{
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH);
i = 0;
pulisciStringa(ricevuto, 10);
}
if (casting.equals(spegni))
{
pinMode(rele, OUTPUT);
digitalWrite(rele, LOW);
i = 0;
pulisciStringa(ricevuto, 10);
}
i = 0;
pulisciStringa(ricevuto, 10);
sms.flush();
}
delay(1000);
}
double flusso;
volatile int count;
void flussometro()
{
count = 0;
interrupts();
delay (1000);
noInterrupts();
flusso = (count * 2.25);
flusso = flusso * 60;
flusso = flusso / 1000;
Serial.print ( "FLUSSO = ");
Serial.println (flusso);
if (flusso < 0.05)
{
digitalWrite (ledErrore, HIGH);
}
else
{
digitalWrite (ledErrore, LOW);
}
}
void pulisciStringa(char* tmp, int dim)
{
int x;
for (x = 0; x < dim; x++)
tmp[x] = 0;
tmp[0] = '\0';
}
void impulso()
{
count = count + 1; //Incrementa count di 1
}
Confido ancora una volta nelle vostre conoscenze, grazie a tutti!!