Non capisco l'inghippo

Ieri ho caricato il medesimo codice e non ha rilevato errori..ora ho modificato lo sketch togliendo il delay e mi dà l'errore su variabile non dichiarata quando sotto il loop c'è la funzione dedicata..

vi allego un estratto l'errore è closeOffice was not declared in this scope :o

grazie in anticipo


void loop() {
if (timeStatus() == timeSet)
{
int h = hour();
switch (h)
{
case 1:
closeOffice();
break;
}
}

void closeOffice();
{
mylcd.setCursor(1, 1);
mylcd.write(0);
mylcd.setCursor(2, 1);
mylcd.print("System Locked");
}

Sono troppe righe, bastano anche metá per farci capire che ci serve una sfera di cristallo per indovinare il Tuo problema. :wink:

dicciamo tutto o niente:

Tutto lo sketch o niente aiuto.
Ciao Uwe

void closeOffice();

Quel puntoevirgola finale non ci vuole.

In ogni caso il codice pubblicato sul forum deve essere racchiuso negli appositi tag che si attivano cliccando sul simbolo "</>" in alto a sinistra (vedi punto 7 del regolamento)

Attilio

ahahah era per non mettere tutto il codice..comunque lo allego..e ps anche togliendo punto e virgola non funziona..poi ho visto che comunque il punto e virgola ci và comunque.

#include <DS1302RTC.h> //includo libreria rtc
#include <Time.h> //includo libreria gestione time
#include <SPI.h> // includo libreria spi
#include <MFRC522.h> //includo libreria lettore rfid
#include <LiquidCrystal_I2C.h> //libreria lcd I2C
#include <Wire.h> //includo libreria wire
#define SS_PIN 6 //definisco i pin rfid
#define RST_PIN 7 // definisco pin reset rfid

LiquidCrystal_I2C mylcd(0x38, 16, 2); // setto il display

DS1302RTC RTC(10, 9, 8); // setto pin RTCD

MFRC522 mfrc522(SS_PIN, RST_PIN);   // setto e creo l'istanza rfid

long previousMillis = 0;  //variabili tempo rfid
long interval = 10;

int rele = 2;  //pin relè
int buzzer = 3; //pin buzzer
int hour() ; //variabile tempo

String uidRFID[] = {"b34cdcc7", "codeRFID_B", "codeRFID_C", "codeRFID_D"}; // tag abilitati (da modificare con i tag di interesse)

byte locked[8] = {B00000, B01110, B10001, B10001, B11111, B11111, B11111, B00000}; // creo carattere speciale
byte Clock[8] = {B00000, B01110, B10011, B10101, B10001, B01110, B00000, B00000};


void setup() {

  mylcd.begin(); //inizializzo lcd
  mylcd.backlight(); //abilito retroilluminazione
  mylcd.createChar(0, locked); //creo carattere speciale e imposto la sua assegnazione a 0
  mylcd.createChar(1, Clock);
  SPI.begin();        // Inizializzo SPI

  pinMode(rele, OUTPUT); //imposto il pin del rele come output

  mylcd.clear(); //pulisco display

  if (RTC.haltRTC()) {  //ciclo di controllo sul rtc se attivo
    mylcd.print("Clock stopped!");
  }
  else {
    mylcd.print("Clock working.");
  }

  mylcd.setCursor(0, 1);
  if (RTC.writeEN())  {   //controllo rom rtc
    mylcd.print("Write allowed.");
  }
  else  {
    mylcd.print("Write protected.");
  }

  delay ( 2000 ); //attendo

  // Setup Time libreria
  mylcd.clear();
  mylcd.print("RTC Sync");
  setSyncProvider(RTC.get); // acquisisco i dati dal rtc e verifico
  if (timeStatus() == timeSet) {
    mylcd.print(" Ok!");
  }
  else  {
    mylcd.print(" FAIL!");
  }
  delay ( 2000 );

  mylcd.clear();




}

void loop() {

  mylcd.setCursor(2, 0);
  mylcd.print("my home");

  if (timeStatus() != timeSet) {
    mylcd.setCursor(0, 1);
    mylcd.print(F("RTC ERROR"));
  }

  if (timeStatus() == timeSet)
  {
    int h = hour();
    switch (h)
    {
      case 1:
        closeOffice();
        break;
      case 2:
        closeOffice();
        break;
      case 3:
        closeOffice();
        break;
      case 4:
        closeOffice();
        break;
      case 5:
        closeOffice();
        break;
      case 6:
        closeOffice();
        break;
      case 7:
        openOffice();
        break;
      case 8:
        openOffice();
        break;
      case 9:
        openOffice();
        break;
      case 10:
        openOffice();
        break;
      case 11:
        openOffice();
        break;
      case 12:
        openOffice();
        break;
      case 13:
        openOffice();
        break;
      case 14:
        openOffice();
        break;
      case 15:
        openOffice();
        break;
      case 16:
        openOffice();
        break;
      case 17:
        openOffice();
        break;
      case 18:
        openOffice();
        break;
      case 19:
        openOffice();
        break;
      case 20:
        openOffice();
        break;
      case 21:
        openOffice();
        break;
      case 22:
        openOffice();
        break;
      case 23:
        openOffice();
        break;
      case 00:
        openOffice();
        break;
    }
  }

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;

    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
      return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    String uid_s = "";

    if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) {

      for (byte i = 0; i < mfrc522.uid.size; i++) {

        String uid_a = String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
        String uid_b = String(mfrc522.uid.uidByte[i], HEX);

        uid_s = uid_s + uid_a + uid_b;


      }
    }


    boolean controllo = false;
    for (int i = 0; i < sizeof(uidRFID) / sizeof(String); i++) {

      if (uidRFID[i] == uid_s) {


        mylcd.setCursor(3, 1);
        mylcd.print("Consentito");
        tone(buzzer, 800, 100);
        delay(500);
        openDoor();
        controllo = true;
        break;

      }
    }

    if (!controllo) {
      mylcd.setCursor(0, 1);
      mylcd.print("!Non Consentito!");
      tone(buzzer, 800, 500);
      displayBlink(3, 400);
      delay(2000);
    }


    mylcd.clear();
  }


  void openDoor() {

    digitalWrite(rele, HIGH);
    delay(2000);
    digitalWrite(rele, LOW);

  }
  void print2digits(int number) {
    // Output leading zero
    if (number >= 0 && number < 10) {
      mylcd.write('0');
    }
    mylcd.print(number);
  }

  void openOffice() {
    mylcd.setCursor(3, 1);
    mylcd.write(1);
    mylcd.setCursor(4, 1);
    mylcd.print("");
    print2digits(hour());
    mylcd.print(":");
    print2digits(minute());
    mylcd.print(":");
    mylcd.print(second());
    mfrc522.PCD_Init(); // Inizializzo MFRC522
  }

  void closeOffice() {
    mylcd.setCursor(1, 1);
    mylcd.write(0);
    mylcd.setCursor(2, 1);
    mylcd.print("System Locked");
  }

  void displayBlink(int blinks, int duration)
  {
    while (blinks--)
    {
      mylcd.noDisplay();
      delay(duration);
      mylcd.display();
      delay(duration);
    }
  }

uwefed:
Sono troppe righe, bastano anche metá per farci capire che ci serve una sfera di cristallo per indovinare il Tuo problema. :wink:

dicciamo tutto o niente:

Tutto lo sketch o niente aiuto.
Ciao Uwe

Mi fanno spaccare quelli come te che hanno dei problemi, gli si dice la soluzione, ma pensano di saperne più di chi li aiuta e fanno di testa loro.

Continua così, farai molta strada.

Non ho controllato altro (non ho le librerie e non posso compilare), ma intanto ti suggerisco un'ottimizzazione ...

Al posto di questo lunghissimo switch :

    int h = hour();
    switch (h)
    {
      case 1:
        closeOffice();
        break;
      case 2:
        closeOffice();
        break;
      case 3:
        closeOffice();
        break;
      case 4:
        closeOffice();
        break;
      case 5:
        closeOffice();
        break;
      case 6:
        closeOffice();
        break;
      case 7:
        openOffice();
        break;
      case 8:
        openOffice();
        break;
      case 9:
        openOffice();
        break;
      case 10:
        openOffice();
        break;
      case 11:
        openOffice();
        break;
      case 12:
        openOffice();
        break;
      case 13:
        openOffice();
        break;
      case 14:
        openOffice();
        break;
      case 15:
        openOffice();
        break;
      case 16:
        openOffice();
        break;
      case 17:
        openOffice();
        break;
      case 18:
        openOffice();
        break;
      case 19:
        openOffice();
        break;
      case 20:
        openOffice();
        break;
      case 21:
        openOffice();
        break;
      case 22:
        openOffice();
        break;
      case 23:
        openOffice();
        break;
      case 00:
        openOffice();
        break;
    }

... puoi semplicemente fare:

    int h = hour();
    if ((h == 0) || (h >= 7)) openOffice();
    else closeOffice();

... un paio di semplici righe :wink:

Guglielmo

SukkoPera:
Mi fanno spaccare quelli come te che hanno dei problemi, gli si dice la soluzione, ma pensano di saperne più di chi li aiuta e fanno di testa loro.

... in effetti, se guardi, il tuo suggerimento l'applicato eccome :smiley: :smiley: :smiley:

Il fatto è che, data la risposta che ti ha dato, NON conosce la differenza tra la dichiarazione di una funzione e la sua successiva chiamata :smiling_imp:

Guglielmo

Beh che dire.io ho qui davanti il libro di Margolis e esplicitamente in un case switch mette punto e virgola..poi se ti dico che l'ho provato ma non và comunque cosa ti devo dire di si per forza?

SukkoPera:
Mi fanno spaccare quelli come te che hanno dei problemi, gli si dice la soluzione, ma pensano di saperne più di chi li aiuta e fanno di testa loro.

Continua così, farai molta strada.

Per me può anche conoscere meno ancora, lo aiuterei comunque volentieri. Ma se mette in discussione quello che gli dico, tanto vale evitare di sprecare il mio tempo. Visto che ne sa più di noi, tanto vale che si arrangi da solo.

Indenta bene il codice e vedrai che manca una chiusura '}' in loop()

Ciao!

francescomi92:
Beh che dire.io ho qui davanti il libro di Margolis e esplicitamente in un case switch mette punto e virgola..poi se ti dico che l'ho provato ma non và comunque cosa ti devo dire di si per forza?

Il puntoevirgola di troppo non è quello nello switch, è quello nella definizione della funzione. Ho scritto che quello sbagliato è:

void closeOffice();

NON:

closeOffice();

Che è ovviamente corretto.

Magari presta attenzione quando leggi gli aiuti che gli altri ti danno. E se ti sembra che non siano corretti magari metti in discussione quel che hai capito tu, prima di quel che ti hanno detto.

francescomi92:
Beh che dire.io ho qui davanti il libro di Margolis e esplicitamente in un case switch mette punto e virgola..poi se ti dico che l'ho provato ma non và comunque cosa ti devo dire di si per forza?

... se fossi un po' più modesto ti accorgeresti che HAI TORTO dato che SukkoPera sta parlando di un'altra cosa ! :smiling_imp:

Se guardi il tuo primo codice avevi scritto:

void closeOffice(); 
{
    mylcd.setCursor(1, 1);
    mylcd.write(0);
    mylcd.setCursor(2, 1);
    mylcd.print("System Locked");
}

che poi invece hai corretto eliminando quel punto e virgola sbagliato dopo closeOffice() !

Sempre prestare attenzione a quello che ti si dice ...

Guglielmo

*@SukkoPera ... ci siamo sovrapposti ... * :grin:

Ci mancherebbe!! appena ho letto il tuo post ho subito controllato..e non và comunque..poi il codice primario che ho inserito io l'ho ricopiato manualmente e ho inserito erroneamente il ; e pensavo che ti riferissi al ; dopo il case..ma comunque l'ide mi avrebbe dato un'alktro errore e non errore di variabile non dichiarata..no? riguarda quello che ho inserito dopo completo dall'ide e vedi che a prescindere non c'è il ;
Amici come prima ? :slight_smile:

SukkoPera:
Per me può anche conoscere meno ancora, lo aiuterei comunque volentieri. Ma se mette in discussione quello che gli dico, tanto vale evitare di sprecare il mio tempo. Visto che ne sa più di noi, tanto vale che si arrangi da solo.

Comunque nell'ultimo codice che ha inviato la defizizione della funzione è ok.
Il problema e che la funzione loop() non è chiusa correttamente, per cui le successive funzioni non vengono viste come tali dal compilatore...

hai ragione cavolo!! probabilmente avendo modificato l'ultima riga ho cancellato anche una } solo che vedendone 2 non pensavo che l'errore fosse questo!! grazie mille

xilav:
Comunque nell'ultimo codice che ha inviato la defizizione della funzione è ok.
Il problema e che la funzione loop() non è chiusa correttamente, per cui le successive funzioni non vengono viste come tali dal compilatore...

Saltava all'occhio più velocemente se indentavi correttamente tutte le funzioni: setup() e loop() partono dalla colonna 0, mentre le altre dalla colonna 2; è li che ti sei fatto ingannare!

Ciao!

grazie guglielmo per il tuo preziosissimo suggerimento..ho provato in mille modi ma alla fine ho dovuto optare per quel lunghissimo switch..pensa che io avevo fatto inizialmente if(hour() > 7) e la funzione open e dopo la else e non funzionava..con questa tua dritta mi prende l'ora istantanea la confronta e se è tra le 7 e le 00 mi mantiene la funzione openoffice?

grazie ancora

gpb01:
Non ho controllato altro (non ho le librerie e non posso compilare), ma intanto ti suggerisco un'ottimizzazione ...

Al posto di questo lunghissimo switch :

    int h = hour();

switch (h)
   {
     case 1:
       closeOffice();
       break;
     case 2:
       closeOffice();
       break;
     case 3:
       closeOffice();
       break;
     case 4:
       closeOffice();
       break;
     case 5:
       closeOffice();
       break;
     case 6:
       closeOffice();
       break;
     case 7:
       openOffice();
       break;
     case 8:
       openOffice();
       break;
     case 9:
       openOffice();
       break;
     case 10:
       openOffice();
       break;
     case 11:
       openOffice();
       break;
     case 12:
       openOffice();
       break;
     case 13:
       openOffice();
       break;
     case 14:
       openOffice();
       break;
     case 15:
       openOffice();
       break;
     case 16:
       openOffice();
       break;
     case 17:
       openOffice();
       break;
     case 18:
       openOffice();
       break;
     case 19:
       openOffice();
       break;
     case 20:
       openOffice();
       break;
     case 21:
       openOffice();
       break;
     case 22:
       openOffice();
       break;
     case 23:
       openOffice();
       break;
     case 00:
       openOffice();
       break;
   }



... puoi semplicemente fare:



int h = hour();
   if ((h == 0) || (h >= 7)) openOffice();
   else closeOffice();



... un paio di semplici righe ;)

Guglielmo

francescomi92:
... con questa tua dritta mi prende l'ora istantanea la confronta e se è tra le 7 e le 00 mi mantiene la funzione openoffice?

if ((h == 0) || (h >= 7)) openOffice();
else closeOffice();

Se la esamini bene la IF chiede prima se h è uguale a zero, oppure si chiede se h è uguale o maggiore di 7 (7, 8, 9, ... 23) ed in tal caso chiama openOffice(), altrimenti, per gli altri casi (1, 2, 3, 4, 5, 6) chiama closeOffice().

Guglielmo

Scusa, ma non ho fatto a meno di guardare il tuo codice, ma mi sembra che anche se sono le 2 di notte ed esegui la closeOffice(), se passo il tag corretto apro lo stesso la porta. E' voluto?