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...
#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);}