Go Down

Topic: Arduino ferma il ciclo Loop() (Read 368 times) previous topic - next topic

MrBrownIT

Ciao a tutti, vi spiego brevemente il motivo che mi ha spinto ad iscrivermi al forum e a chiedervi aiuto!!  :)  :)
Praticamente sto realizzando un progetto per cui tramite dei relè muovo avanti e indietro un brushless 12VDC, ma se un sensore induttivo non rileva la presenza di un pezzo allora inibisco il funzionamento dei relè, attivo una spia luminosa, e invio una chiamata ad un numero telefonico, per segnalare la mancanza del pezzo.
Tutto funziona perfettamente, fino a quando lancio la funzione CHIAMATA(), a quel punto il loop di arduino si punta, o almeno credo sia così!
Quello che vorrei ottenere è che una volta tornato il segnale di presenza pezzo arduino torni ad eseguire il ciclo normalmente.

Grazie per il vostro prezioso aiuto!!
Ecco il codice...

Code: [Select]
#include <swRTC.h>
#include <SoftwareSerial.h>
#include <String.h>

swRTC rtc; //creo una nuova istanza

SoftwareSerial mySerial(3, 2); //definisco le porte per la comunicazione seriale GSM

const int buttonPin = 4;
const int sensorPin = 9;
const int allarmPin =  13;

int buttonState = 0;
int sensorState = 0;
int relay1 = 8;
int relay2 = 7;
int relay3 = 6;
int var = 0;



void setup() {
  //orologio software
rtc.stopRTC(); //stop the RTC
rtc.setTime(12,0,0); //set the time here
rtc.setDate(4,6,2012); //set the date here
rtc.startRTC(); //start the RTC
 
  Serial.begin(19200); //velocità seriale del programma
  mySerial.begin(19200); //velocità seriale del modulo GSM
  pinMode(allarmPin, OUTPUT);
}



void loop() {
 
//verifico che la comunicazione seriale sia stabilita
while(mySerial.available()!=0);{}delay(10);

//Serial.write(mySerial.read());

//stampo l'orario su monitor seriale
    Serial.print(rtc.getHours(), DEC);
    Serial.print(":");
    Serial.print(rtc.getMinutes(), DEC);
    Serial.print(":");
   Serial.print(rtc.getSeconds(), DEC);
    Serial.println(" ");
   

   
//stato presenza pezzo
sensorState = digitalRead(sensorPin);

if (sensorState == HIGH) {
    // turn LED on:
    digitalWrite(allarmPin, HIGH); //spia allarme accesa
    Serial.println("Croccantini esauriti");
    Serial.println("Spia allarme ACCESA");
    Serial.println("Tramoggia DISABILITATA");
    Serial.println("Imposto la chiamata");
    CHIAMATA(); //lancio la funzione per chiamare
  } else {
    // se il pezzo è presente tutto ok
    digitalWrite(allarmPin, LOW);
    Serial.println("Pezzo OK");
  }
  //se l'orario lo consente avvio la sequenza motore
if (sensorState == LOW && rtc.getHours()== 12 && rtc.getMinutes()== 00 && rtc.getSeconds()== 5) {startmotor();}
        }

void startmotor(){
//numero di cicli di carico da eseguire (5)
 while(var < 5){
 pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT);

 digitalWrite(relay3, LOW); //ABILITA TUTTO
 //AVANTI
 digitalWrite(relay1, LOW);
 digitalWrite(relay2, LOW);
 Serial.print("AVANTI");
 delay(1000); // wait 2 seconds

 digitalWrite(relay3, HIGH);//STOP TUTTO
 digitalWrite(relay1, HIGH);
 digitalWrite(relay2, HIGH);
 delay(1000); //ATTESA PER INVERSIONE MARCIA
 
 //INDIETRO
 digitalWrite(relay3, LOW);//ABILITA TUTTO
 digitalWrite(relay1, HIGH);
 digitalWrite(relay2, HIGH);
 Serial.print("INDIETRO");
 delay(1000); // wait 2 seconds

  digitalWrite(relay3, HIGH);//STOP TUTTO
  delay(5000); // wait 2 seconds

  var++;
}}

void CHIAMATA() {
 mySerial.println("ATD329xxxxx135;");//dial the number, xxxx ix the phone number.
 delay(100);
 Serial.print("Chiamata in corso...");
 delay(5000);}

MatteoDerrico

ciao :)

allora secondo me il ciclo loop non si pianta (premetto che ho dato un'occhiata veloce), c'è solo un piccolo problema di logica di programmazione.

allora cerco di spiegartelo ma da scrivere lo trovo difficile:

partiamo quando c'è il pezzo, il programma funziona bene... e fin qui tutto OK.

quando non c'è più il pezzo lui scrive in seriale delle stringe e poi fa partire la chiamata. ecco il problema sta a quello che succede dopo, ovvero finita la subroutine CHIAMATA lui re-inizia il ciclo loop e a meno che tu non abbia caricato il pezzo nuovo lui entra sempre nell' if di mancanza pezzo... e continua ad ogni ciclo successivo ad entrarci fin che non metti il pezzo.
solo che così facendo la subroutine CHIAMATA viene eseguita ogni ciclo loop.

per risolvere basta creare una variabile anche solo di tipo bool.... prova a trovare soluzione, se proprio non riesci vedremo come farti arrivare alla soluzione... a me non piace scrivere codice per altri solo perchè se no non si comprende davvero l'errore.....
ripeto sempre ammesso che sia quello ahaha

in attesa di un tuo aggiornamento...

MD

torn24

#2
Oct 21, 2017, 07:44 am Last Edit: Oct 21, 2017, 08:05 am by torn24
Forse ho trovato il problema, MA DOPO aver ricevuto la risposta, sei pregato, per rispetto alla comunità, di presentarti brevemente nell'apposito subforum, dicendo quali conoscenze hai di programmazione e elettronica.


Quando chiami la funzione chiama, trasmetti dei caratteri sulla SoftwareSerial, ora nella condizione che hai messo nel while() all'interno del loop(), gli dici fiche ci sono caratteri esegui il while().



Code: [Select]

//verifico che la comunicazione seriale sia stabilita
while(mySerial.available()!=0);{}delay(10);  //finché available restituisce un numero diverso da
                                                                   // zero continua il while-loop


/* il codice dovrebbe essere*/

/* è meglio che nella stringa trasmessa controlliamo con un carattere terminatore
   in questo caso uso il carattere ';' per controllare che la stringa sia finita*/
char c;
if(myserial.available()>0){//se ci sono caratteri da leggere

     do{// Finché ci sono caratteri da leggere
         while(!myserial.available()); //Attendo che ci sia un carattere sulla seriale
         c=mySerial.read();
         Serial.write(c);
    }while(c!=';');


}



gpb01

#3
Oct 21, 2017, 08:54 am Last Edit: Oct 21, 2017, 08:54 am by gpb01
>MrBrownIT:  essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo


>MatteoDerrico, torn24: Vi prego, prima di rispondere, di verificare sempre se l'utente abbia effettuato la presentazione, cosa che, ovviamente, NON può essere possibile se il suo numero di post è 1. Grazie anticipatamente per la collaborazione. :)
Search is Your friend ... or I am Your enemy !

MrBrownIT

Grazie mille, con i vostri consigli sono riuscito a riolvere il problema è ora tutto funziona, se qualcuno dovesse avere in futuro lo stesso problema, posto il codice:

Code: [Select]

void CHIAMATA() {
 
        Serial.println("Imposto la chiamata");
 mySerial.available()!=0; delay(10);
 mySerial.println("ATD329xxxxx135;");//dial the number, xxxx ix the phone number.
 delay(100);
        Serial.print("Chiamata in corso...");
        delay(5000);
   }

gpb01

#5
Oct 23, 2017, 09:11 pm Last Edit: Oct 23, 2017, 09:12 pm by gpb01
>MrBrownIT:  vedo che hai ignorato la mia richesta, quindi ...
... ti chiedo ancora una volta di fare quanto ho scritto al post #3.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up