Mancato funzionamento programma a seguito dell'unione di due sketch funzionanti

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

Bella la sintesi, ma... cosa non va ? Non compila ? Non gira ? Non fa quello che ti aspetti ?

ma...  cosa non va ?

Non fa quello che mi aspetto o meglio, non fa quello che i due codici postati per primi invece fanno se lanciati separatamente.

Non so se mi sia spigato...

Ad esempio, se apro il monitor seriale non mi stampa niente, mentre il primo codice se lanciato da solo funziona alla grande con tanto di monitor seriale..

Ma hai controllato i pin che utiizzi e se ci sono conflitti ? ? ? Non è che basta cambiare scheda eh, occorre anche modificare i codici ...

Guglielmo

attachInterrupt(digitalPinToInterrupt(21), impulso, RISING);

Ma hai controllato i pin che utiizzi e se ci sono conflitti ? ? ?

Sulla base delle mie conoscenze tutto dovrebbe funzionare. Anche perché ripeto i due sketch separatamente funzionano ed ovviamente al momento dell'unione la parte hardware resta invariata.

attachInterrupt(digitalPinToInterrupt(21), impulso, RISING);

anche utilizzando questa stringa non va.

Ripeto un mio grande dubbio: perchè non mi stampa nulla sul monitor seriale nel programma complessivo mentre invece il primo sketch funziona perfettamente? :disappointed_relieved:

Ragazzi è ben accetto ogni tipo di consiglio poiché non so più cosa fare... Grazie a chiunque interverrà!

ciao...giusto per prova...elimina o commenta:

interrupts();   //Abilita gli interrupt

  noInterrupts(); //Disabilita gli interrupt

... di sicuro, se disabiliti gli interrupt, le seriali smettono di funzionare visto che ... sono "interrupt driven" :smiling_imp:

Guglielmo

P.S.: E non solo quelle ...

prova a spostare il pin 21 sul 18 o 19, perchè il 20 e 21 che sono l'I2C hanno sulla mega una resistenza di pullup incorporata

Ragazzi niente.. Ho provato i vostri suggerimenti ma purtroppo non va ancora. Chissà....

I led mi si accendono entrambi (il primo indica che c'è connessione ed il secondo che il flussometro sta rilevando un valore troppo basso) ma non riesco a far funzionare tutto il resto..

ciao...come ti ho detto disabilita:

  //interrupts();
  //noInterrupts();

in più disabilita questa parte del setup():

while (connessione)
  {
    if (gsmAccess.begin() == GSM_READY)
      connessione = false;
  }

Orso2001 se disabilito la seconda non mi va più in rete il modulo gsm. La prima l'ho tentata ma ti ha già risposto gbp01.

allora...l'ho scritto perchè pensavo non uscissi dal loop...poi ho riletto il tuo post.

se commento interrupts() e noInterupts()...mi stampa ogni 5-6 secondi "FLUSSO" etc
se commento pompa()...mi stampa "FLUSSO" ogni secondo circa...quindi il problema è nella funzione pompa()...purtroppo non conosco quella libreria...

EDIT:...pensavo non uscissi dal setup()...

Il problema che mi fa rabbia è che prese singolarmente le due funzioni girano perfettamente!!

Comunque attendo i consigli di qualcuno che possa aiutarmi..

Se Tu voi andare al cinema con gli amici e Ti serve la machhina. Va bene
Se Tua moglie vuole andare con le amiche al aperitivo e ha bisogno della macchina va anche bene.
Se Il cinema e l'aperitivo sono la stessa sera in 2 posti lontani non va bene perché hai solo una macchina.
Ciao Uwe

Se Tu voi andare al cinema con gli amici e Ti serve la machhina. Va bene
Se Tua moglie vuole andare con le amiche al aperitivo e ha bisogno della macchina va anche bene.
Se Il cinema e l'aperitivo sono la stessa sera in 2 posti lontani non va bene perché hai solo una macchina.

Ti ringrazio per questa tua divertente digressione ma capisci bene che è inutile. Avrei bisogno del supporto di qualcuno, molto più esperto di noi due, che possa trovare delle soluzioni non di qualcuno che racconti aneddoti :grin:

ciao LucaM,

giusto per curiosità...dato che singolarmente i due sketch ti funzionano...hai provato a misurare quanto tempo impiega la sola funzione pompa() a chiudere il suo cerchio...sia se chiamata come funzione sia se scritta letteralmente nel loop()?