ciao a tutti , mi devo creare un piccolo antifurto usando un vecchio telefono cellulare, visto che ne ho un po' che non uso , portando fuori i fili del tastierino , per ora mi sono creato il listato per effettuare la chiamata .
e corretto cosi l uso di millis();
poi chiedero aiuto per il resto....
per ora grazie
Ciao, diciamo che con millis ci siamo come uso anche se puoi migliorare il codice usando uno switch al posto di tutti gli if
Es.
switch(passaggio )
{
case 0:
if(millis() - led1OnTime >= 3000)
{
..
}
break
case 1:
if ((millis() - led1OnTime >= 4000))
{
passaggio=2;
}
break
...
}
in modo che il codice divenga più leggibile.
Poi può anche andare bene calcolare i tempi partendo dall'inizio di ciò che li scatena ma puoi anche pensare di farli dipendere dal valore di millis() dell'evento che li precede in modo che se devi aggiungere uno stato intermedio o variare una tempistica non sei costretto a variare tutte le successive ti basta riassegnare alla variabile led1OnTime il valore di millis() dentro i vari if che fanno ciò che devono nei singoli passaggi:
switch(passaggio )
{
case 0:
if(millis() - led1OnTime >= 3000)
{
...
led1OnTime = millis();
}
break
case 1:
if ((millis() - led1OnTime >= 1000)) //Differenza rispetto allo sato precedente e non all'inizio
{
...
passaggio=2;
led1OnTime = millis();
}
break
...
}
io prima di tutto ti direi di controllare quanto sono vecchi i tuoi cellulari
perché se stanno dismettendo alcuni servizi GSM e alcuni moduli GSM comperati "adesso" per Arduino tra poco diverranno inutili, a maggior ragione temo che i i telefonini "già" vecchi non rimarranno utilizzabili a lungo
ciao a tutti ho aggiunto anche il caso che il cellulare sia spento.ed ho limitato le chiamate per evento a 3 , e corretto cio' che ho scritto?
grazie mille
unsigned long led1OnTime = 0;
boolean flag = 0;
boolean flag_1 = 0;
boolean lcd_cell = 0;
byte conta = 0;
int passaggio = 99;
byte old_passaggio = 25;
void setup() {
Serial.begin(9600);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(4, OUTPUT);//rele tasto C
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(4, HIGH);
delay(200);
digitalWrite(5, HIGH);
delay(200);
digitalWrite(6, HIGH);
delay(200);
digitalWrite(7, HIGH);
delay(200);
Serial.println("connessione attiva");
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void loop() {
if (digitalRead(10) == LOW ) {
lcd_cell = 1;
}
else {
lcd_cell = 0;
}
if (conta > 2) { // imposto limite 3 chiamate per evento
Serial.println("stop");
}
if (conta < 3) {
// put your main code here, to run repeatedly:
if (digitalRead(11) == LOW && flag == 0) {
Serial.println("PREMUTO");
Serial.println(led1OnTime);
passaggio = 55;
flag = 1;
}
else if (digitalRead(11) == HIGH ) {
flag = 0;
}
if (passaggio != old_passaggio) {
Serial.println(passaggio);
old_passaggio = passaggio;
}
switch (passaggio )
{
case 55: { //controllo se il cellulare
// e' acceso
Serial.println("premo tsto Ce controllo se e' acceso");
digitalWrite(5, HIGH);
passaggio = 56;
led1OnTime = millis();
}
break;
case 56: {//rilascio tasto C
if (millis() - led1OnTime >= 500) {
Serial.println("rilascio tasto C");
digitalWrite(5, LOW);
led1OnTime = millis();
passaggio = 57;
}
}
break;
case 57: {//controllo se il display del
// cellulare e' acceso
if (millis() - led1OnTime >= 1500) {
Serial.println("controllo se acceso");
led1OnTime = millis();
if ( lcd_cell == 0) { // se e' spento
Serial.println("Spento");
digitalWrite(5, HIGH);
Serial.println("pressione lunga accensione");
passaggio = 58 ;
}
else {//se e' acceso
Serial.println("acceso avvio chiamate");
passaggio = 0;
}
}
}
break;// accendo il cellulare pressione lunga
case 58: { //accendo il cell
if (millis() - led1OnTime >= 2000) {
Serial.println("pressione lunga accansione rilascio");
digitalWrite(5, LOW);
passaggio = 59;
led1OnTime = millis();
}
}
break;
case 59: { //aspetto il loop del cellulare
if (millis() - led1OnTime >= 5000) {
Serial.println("aspetto il loop del cellulare");
passaggio = 55;
led1OnTime = millis();
}
}
break;
// cancello eventuali numeri sul display sul cell
case 0: { //premo tasto rosso
if (millis() - led1OnTime >= 3000) {
Serial.println("premo pulsante rosso on ");
digitalWrite(4, HIGH); //rele tasto ROSSO on
passaggio = 1;
led1OnTime = millis();
}
}
break;
case 1: { //rilascio tasto rosso
if ((millis() - led1OnTime >= 500)) {
Serial.println("rilascio tasto rosso on ");
digitalWrite(4, LOW); //rele tasto ROSSO off
passaggio = 3;
led1OnTime = millis();
}
}
break;
case 2: { //ri premo tasto rosso
if ((millis() - led1OnTime >= 1000)) {
Serial.println("ri premo pulsante rosso on ");
digitalWrite(4, HIGH); //rele tasto ROSSO on
passaggio = 3;
led1OnTime = millis();
}
}
break;
case 3: { //ri rilascio tasto rosso
if ((millis() - led1OnTime >= 500)) {
Serial.println("ri rilascio tasto rosso ");
digitalWrite(4, LOW); //rele tasto ROSSO on
passaggio = 4;
led1OnTime = millis();
}
}
break;
case 4: { //premo tasto C
if ((millis() - led1OnTime >= 500)) {
Serial.println("premo tasto C");
digitalWrite(5, HIGH); //rele tasto ROSSO on
passaggio = 5;
led1OnTime = millis();
}
}
break;
case 5: { //rilascio tasto C
if ((millis() - led1OnTime >= 500)) {
Serial.println("rilascio tasto C");
digitalWrite(5, LOW); //rele tasto ROSSO on
passaggio = 6;
led1OnTime = millis();
}
}
break;
//da qui inizio prima telefonata
case 6: { //pressione lunga tasto 1 chiamata rapida
if ((millis() - led1OnTime >= 1000)) {
Serial.println("pressione lunga tasto 1 chiamata");
digitalWrite(6, HIGH); //rele tasto chiamata
passaggio = 7;
led1OnTime = millis();
}
}
break;
case 7: { //rilascio tasto 1 chiamata rapida
if ((millis() - led1OnTime >= 1000)) {
Serial.println("rilascio tasto 1 chiamata");
digitalWrite(6, LOW); //rele tasto chiamata
passaggio = 8;
led1OnTime = millis();
}
}
break;
case 8: { //chiudo telefonata premo rosso
if ((millis() - led1OnTime >= 30000)) {
Serial.println("chiudo 1 telefonata premo rosso");
digitalWrite(5, HIGH); //rele tasto chiamata
passaggio = 9;
led1OnTime = millis();
}
}
break;
case 9: { //rilascio rosso
if ((millis() - led1OnTime >= 1000)) {
Serial.println("rilascio 1 rosso");
digitalWrite(5, LOW); //rele tasto chiamata
passaggio = 10;
led1OnTime = millis();
}
}
break;
//aspetto ed faccio la 2 telefonata
case 10: { //pressione lunga tasto 2 chiamata rapida
if ((millis() - led1OnTime >= 2000)) {
Serial.println("pressione lunga tasto 2 chiamata");
digitalWrite(7, HIGH); //rele tasto chiamata
passaggio = 11;
led1OnTime = millis();
}
}
break;
case 11: { //rilascio tasto 2 chiamata rapida
if ((millis() - led1OnTime >= 1000)) {
Serial.println("rilascio tasto 2 chiamata");
digitalWrite(7, LOW); //rele tasto chiamata
passaggio = 12;
led1OnTime = millis();
}
}
break;
case 12: { //chiudo telefonata premo rosso
if ((millis() - led1OnTime >= 30000)) {
Serial.println("chiudo telefonata 2 premo rosso");
digitalWrite(5, HIGH); //rele tasto chiamata
passaggio = 13;
led1OnTime = millis();
}
}
break;
//fine telefonata
case 13: { //rilascio rosso
if ((millis() - led1OnTime >= 1000)) {
Serial.println("rilascio 2 rosso");
digitalWrite(5, LOW); //rele tasto chiamata
conta = conta + 1;
passaggio = 25;
led1OnTime = millis();
}
}
break;
}
}
}
Se il tuo sistema si accende solo quando accade un evento può anche andare bene ma se, invece, resta sempre acceso non azzerando mai la variabile "conta" farai solo tre chiamate e poi non farai più nulla.
Inoltre setti la variabile passaggio a 25 e non hai la gestione di tale stato