Buongiorno a tutti, vi volevo chiedere aiuto riguardo al programma che ho scritto per il mio progetto della maturità.
il progetto tratta di un sensore a gas che attiva un buzzer, una ventola e un sensore tmp, se il tmp rileva un valore di temperatura oltre a una certa soglia manda un messaggio con la shield gsm. il programma è il seguente: #include <GSM.h> #define PINNUMBER "3333"
GSM gsmAccess;
GSM_SMS sms;
char remoteNumber[20]= "3423606518";
char txtMsg[200]="temperatura superiore ai 30 gradi";
int gas=0;
float T=0;//temperatura
int sensorTmp=A1;
int tmpPin=A2;
int gasPin=A0;
float const q = 1023/5.0;//quanto copnversione analogico/digitale
boolean AllarmeAttivato;
boolean gsm_inizializzazione ();
boolean Attiva_Allarme (int gas);
void sendSMS ();
void setup()
{
pinMode(A0,INPUT); //sensore gas
pinMode(8, OUTPUT); //ventola
pinMode(12, OUTPUT); //Buzzer
pinMode(A2,INPUT);//sensore di temperatura
}
void loop(){
Serial.begin(9600);
while(true){
while(gsm_inizializzazione()==false){
Serial.println("GSM non inizializzata, riprovo a connettermi");
delay(500);
}
Serial.println("GSM inizializzata");
//funzione per lettura e scritturadei valori del gas e del tmp
sensorTmp=analogRead(tmpPin); //leggo il valore del sensore di temperatura
//Visualizzo la temperatura sul monitor
Serial.println(T);
gas=analogRead(gasPin); //leggo il valore del sensore di gas
//Visualizzo il valore del gas sul monitor
Serial.println("il valore del gas è:");
Serial.println(gas);
//parte di attivazione dell'allarme
AllarmeAttivato=Attiva_Allarme(gas);
//Parte gestione invio SMS
if(AllarmeAttivato==true){
sendSMS();
}
//acquisisco i dati ogni 1/2 secondo
delay(500);
}
}
void sendSMS(){//funzione da impostare se la temperatura è maggiore di 30 gradi
Serial.print("Message to mobile number: ");
Serial.println(remoteNumber);
// testo del messaggio
Serial.println("INVIO");
Serial.println();
Serial.println("Messaggio:");
Serial.println(txtMsg);
// invio del messaggio
sms.beginSMS(remoteNumber);
sms.print(txtMsg);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
}
//connessione gsm
// funzione stato della connessione
boolean notConnected = true;
// Avvio della shiel GSM
// If your SIM has PIN, pass it as a parameter of begin() in quotes
boolean gsm_Inizializzazione(){
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY){
notConnected = false;
return(true);
}
else
{
Serial.println("Not connected");
delay(1000);
return(false);
}
}
//funzione per l'attivazione del buzzer e della ventola
boolean Attiva_Allarme(gas);{//aggiungi il delay tolto
if ( gas > 20)
{
//buzzer ON
analogWrite(12, 30);
//attivo la ventola
digitalWrite(8, HIGH);
return(true);}
else
{
//buzzer OFF
analogWrite(12, 0);
//disattivo la ventola
digitalWrite(8, LOW);
return(false);
}
}}
Inizialmente mi dava un errore alla riga 96 dicendomi che mancava una "," o un ";" prima della parentesi "{". al che ho controllato tutte le parentsi, virgole e punti e virgola e siccome non ho trovato errori ho aggiunto il ";" richiesto prima della {. Ho compilato e mi ha detto che mancava una } alla fine di tutto il codice e dopo averla aggiunta mi ha dato "errore durante la compilazione". Riuscireste a darmi una mano? io lo st guardando da due giorni ma non riesco a trovare l'errore
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Ho fatto le presentazione e ho letto il regolamento, scusate se ho mancato alle regole del forum in questo post, le ignoravo;
Ti ringrazio per i consigli sull'indentazione delle parentesi. Avresti qualche suggerimento per la correzione dell'errore del mio codice? non riesco proprio a uscirne
@ssortejio: Ti è stato già detto che il codice, in conformità al REGOLAMENTO, punto 7, DEVE essere racchiuso tra i tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra), quindi ...
... devi editare il tuo primo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE.
ssortejio:
Inizialmente mi dava un errore alla riga 96 dicendomi che mancava una "," o un ";" prima della parentesi "{". al che ho controllato tutte le parentsi, virgole e punti e virgola e siccome non ho trovato errori ho aggiunto il ";" richiesto prima della {. Ho compilato e mi ha detto che mancava una } alla fine di tutto il codice e dopo averla aggiunta mi ha dato "errore durante la compilazione". Riuscireste a darmi una mano? io lo st guardando da due giorni ma non riesco a trovare l'errore
Per primo dacci anche tutti gli errori.
poi nella funzione boolean gsm_Inizializzazione() c'é una "}" di troppo
poi il loop() é giá una funzione che viene chiamata di continuo. non serve un "while(true)". Metti il Serial.begin nel setup() e cosí puoi toglere il while(true)
Le entrate analogiche usate come entrate analogiche non hanno bisogno di un pinMode. togliele
Il "boolean notConnected = true;" nella riga 77 é fuori da qualsiasi funzione. Questo é un errore.
riga 96: "boolean Attiva_Allarme(gas);{" nella definizione della funzione non ci va il ";"
Forse dovresti imparare meglio il linguaggio di programmazione.
Usa il notepad++ come editore impostando come linguaggio il C++. puoi visualizzare l' inizio e fine delle parentesi.
tipo di Arduino: Arduino UNO
errori:
"
Arduino:1.6.6 (Windows 10), Scheda:"Arduino/Genuino Uno"
sketch\gsm_ultimo.ino.cpp.o: In function `loop':
C:\Users\Marco\Desktop\gsm_ultimo/gsm_ultimo.ino:35: undefined reference to `gsm_inizializzazione()'
collect2.exe: error: ld returned 1 exit status
exit status 1
Errore durante la compilazione
"
codice:
#include <GSM.h>
#define PINNUMBER "3333"
GSM gsmAccess;
GSM_SMS sms;
char remoteNumber[20] = "3423606518";
char txtMsg[200] = "temperatura superiore ai 30 gradi";
int gas = 0;
float T = 0; //temperatura
int sensorTmp = A1;
int tmpPin = A2;
int gasPin = A0;
float const q = 1023 / 5.0; //quanto copnversione analogico/digitale
boolean AllarmeAttivato;
boolean gsm_inizializzazione ();
boolean Attiva_Allarme (int gas);
void sendSMS ();
void setup()
{
pinMode(A0, INPUT); //sensore gas
pinMode(8, OUTPUT); //ventola
pinMode(12, OUTPUT); //Buzzer
pinMode(A2, INPUT); //sensore di temperatura
}
void loop() {
Serial.begin(9600);
while (true) {
while (gsm_inizializzazione() == false) {
Serial.println("GSM non inizializzata, riprovo a connettermi");
delay(500);
}
Serial.println("GSM inizializzata");
//funzione per lettura e scritturadei valori del gas e del tmp
sensorTmp = analogRead(tmpPin); //leggo il valore del sensore di temperatura
//Visualizzo la temperatura sul monitor
Serial.println(T);
gas = analogRead(gasPin); //leggo il valore del sensore di gas
//Visualizzo il valore del gas sul monitor
Serial.println("il valore del gas è:");
Serial.println(gas);
//parte di attivazione dell'allarme
AllarmeAttivato = Attiva_Allarme(gas);
//Parte gestione invio SMS
if (AllarmeAttivato == true) {
sendSMS();
}
//acquisisco i dati ogni 1/2 secondo
delay(500);
}
}
void sendSMS() { //funzione da impostare se la temperatura è maggiore di 30 gradi
Serial.print("Message to mobile number: ");
Serial.println(remoteNumber);
// testo del messaggio
Serial.println("INVIO");
Serial.println();
Serial.println("Messaggio:");
Serial.println(txtMsg);
// invio del messaggio
sms.beginSMS(remoteNumber);
sms.print(txtMsg);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
}
//connessione gsm
// funzione stato della connessione
boolean notConnected = true;
// Avvio della shiel GSM
// If your SIM has PIN, pass it as a parameter of begin() in quotes
boolean gsm_Inizializzazione() {
while (notConnected)
{
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
return (true);
}
else
{
Serial.println("Not connected");
delay(1000);
return (false);
}
}
}
//funzione per l'attivazione del buzzer e della ventola
boolean Attiva_Allarme(int gas) {//aggiungi il delay tolto
if ( gas > 20)
{
//buzzer ON
analogWrite(12, 30);
//attivo la ventola
digitalWrite(8, HIGH);
return (true);
}
else
{
//buzzer OFF
analogWrite(12, 0);
//disattivo la ventola
digitalWrite(8, LOW);
return (false);
}
}
La dichiarazione dei pin analogici la tengo così il circuito risulta maggiormente comprensibile in relazione al codice, lo dovrò esporre anche a commissari esterni che magari non sanno niente a riguardo;
Il ciclo while l'ho aggiunto perché il programma si bloccava perché non ciclava correttamente;
La riga 77 serve ad inizializzare la variabile not_Connected a true;
Si, non sono una cima in programmazione, anzi, non pensavo che avrei riscontrato così tante difficoltà, vi ringrazio per la pazienza e per la disponibilità.
La dichiarazione dei pin analogici la tengo così il circuito risulta maggiormente comprensibile in relazione al codice, lo dovrò esporre anche a commissari esterni che magari non sanno niente a riguardo;
No, é proprio un errore perché attivi il pin come entrata digitale.
La riga 77 serve ad inizializzare la variabile not_Connected a true;
allora mettila sopra all'inizio dove sono le altre variabili,
"gsm_inizializzazione" é una funzione diversa dalla "gsm_Inizializzazione" devi stare attento alle lettere scritte in maiuscolo/minuscolo.