Lettura impostazioni da EEPROM

Ciao a tutti, è la prima volta che utilizzo la libreria eeprom e ho un problema: Utilizzando la libreria multiCameraIrControl che permette di inviare sengali di scatto ir a diversi modelli di reflex, ho pensato di dare la possibilità di scegliere da un menu il modello di camera da utilizzare e quindi, il segnale ir che deve invaire.

Ora, ho creato un sistema su lcd che fa scorrere tutti i tipi di reflex disponibili, e tramite la pressione del tasto select memorizzare il "camera_index" su eeprom.
Tutto funziona correttamente per quanto riguarda la memorizzazione ma ora ho notato che la libreria ha bisogno di dichiarare il modello di camera fuori dal loop e setup (in fase di inizializzazione quindi).

Ed invece la lettura della eeprom non avviene fuori da loop o setup, quello che sia.

A me servirebbe una cosa del genere:

-leggo su eeprom all'indirizzo X il camera_index.
-e poi in base al camera_index seleziono quello che desidero.

Tipo così:

//MULTICAMERA IR CONTROL SELECTION
  camera_index = EEPROM.read(0);
  Serial.println(camera_index);
  /*"Canon - 0" 
   "Nikon - 1" 
   "Minolta - 2" 
   "Olympus - 3" 
   "Pentax - 4" 
   "Sony"  - 5*/
  if(camera_index == 0)
  {
    Serial.println("canon");
    Canon D5(11);
  }
    
  }
  if(camera_index == 1)
  {
    Serial.println("nikon");
    Nikon D5000(11);
  }
  if(camera_index == 2)
  {
    Serial.println("minolta");
    Minolta A900(11);
  }
  if(camera_index == 3)
  {
    Serial.println("olympus");
    Olympus E5(11);
  }
  if(camera_index == 4)
  {
    Serial.println("pentax");
    Pentax K7(11);
  }
  if(camera_index == 5)
  {
    Serial.println("sony");
    Sony A900(11);
  }

A me servirebbe fare questo fuori dal setup() o loop() ma a quanto pare la lettura dell'eeprom non è possibile farla lì fuori..

Qualche consiglio?

Grazie

Nik_90:
Ed invece la lettura della eeprom non avviene fuori da loop o setup, quello che sia.

Che significa questa cosa? Non la capisco.
Setup e loop sono le 2 funzioni base di uno sketch, non c'è niente che sta "fuori" di esse. Se sta "fuori" non viene eseguito. Per stare "fuori" dev'essere una funzione non richiamata né dal setup né dal loop. Spiegati meglio. :sweat_smile:

Sisi scusa per la fretta mi sono espresso male! Io praticamente ho intenzione di leggere un dato x dalla eeprom e, utilizzare quello che leggo per impostare un dato y.. Vediamo se riesco così:)

If (x == 1)
{
Y = a;
}

If (x == 2)
{
Y = b;
}

void setup()
{
int x = eeprom.read(a);
}

void loop()
{

}

Per capire ancora meglio

#include <multiCameraIrControl.h>

Canon D5(9);

void setup()
{
}

void loop()
{
  D5.shutterNow();
  delay(5000);
  D5.shutterDelayed();
  delay(5000);
}

Io avrei bisogno di cambiare "Canon D5(9);" in base a quello che leggo dalla eeprom!

Se leggo 1 allora è Canon D5(9);
Se leggo 2 allora è Nikon(9);
...

Insomma spero di aver spiegato le mie intenzioni! :slight_smile:

Uhm. con Canon D5(9) tu istanzi una nuova classe D5 di tipo Canon. Messa al di fuori del setup diventa una dichiarazione visibile globalmente. Se la metti nel setup, è ovvio che tu dal loop non la veda più. Ora capisco cosa vuoi dire.
Se non chiami nessun metodo all'interno di setup, potresti da qui leggere la Eeprom e poi potresti spostare l'istanziamento della classe dentro al loop, relegando però il resto del codice in un altro loop infinito in modo da creare una sezione di codice eseguita solo 1 volta.

#include <multiCameraIrControl.h>

void setup()
{
}

void loop()
{
  Canon D5(9);
  do { 
    D5.shutterNow();
    delay(5000);
    D5.shutterDelayed();
    delay(5000);
  } while (1); //nuovo ciclo infinito
}

Tieni presente però che così poi D5 non è più visibile al di fuori di loop, quindi se dal loop chiami una funzione, questa non deve e no può accedere a D5.

Ed invece io dal loop per arrivare ad utilizzare D5 utilizzo forse un paio di funzioni che si chiamano.. Era giusto per essere più ordinati e fare il controllo all'inizio.. (anche se ora che ci penso io effettuo il controllo all'inizio, poi se nel loop arrivo alla funzione che dovrebbe modificare l impostazione e scrivo il dato sulla eeprom, per refreshare tutto dopo mi servirebbe un riavvio dell'atmega no? O.o )
A questo punto allora faccio che nella funzione dove devo "inviare" il segnare ir tramite ad esempio D5 leggo la eeprom, eseguo il controllo di quello che devo utilizzare e così proseguo..

Non potresti modificare la libreria in modo tale che sia essa stessa a leggere la EEPROM?

leo72:
Non potresti modificare la libreria in modo tale che sia essa stessa a leggere la EEPROM?

mh. Cioè? Non ho mai modificato/creato un libreria anche se mi piacerebbe tanto. Da dove dovrei partire per fare ciò che hai detto tu?:slight_smile:

Ne approfitto per segnalare un'altra questione che mi è venuta in mente.

ho reperito tutti i comandi che è possibile dare tramite la libreria, ecco:

Canon D5(9); --> D5.shutterNow(); / D5.shutterDelayed();
Minolta A900(9); ---> A900.shutterNow(); / A900.shutterDelayed();
Nikon D5000(9); ---> D5000.shutterNow();
Olympus E5(9); ----> E5.shutterNow();/ E5.zoomin(50);/ E5.shutterNow();/ E5.zoomout(50);
Pentax K7(9);----> K7.shutterNow();
Sony A900(9); ----> A900.shutterNow(); / A900.shutterDelayed();

Il problema quindi non sussisterebbe solo nel leggere la eeprom e utilizzare CanonD5 oppure Minolta A900 ecc.. ma anche al momento dello scatto! Perchè se uso Canon D5() devo utilizzare D5.shutterNOW, se uso Minolta A900 devo usare A900.shutterNow() e così via...

Io avevo provato a fare una cosa del genere:

//MULTICAMERA IR CONTROL SELECTION (leggo la eeprom per vedere che fotocamera deve essere utilizzata
  camera_index = EEPROM.read(0);
  Serial.println(camera_index);
  /*"Canon - 0" 
   "Nikon - 1" 
   "Minolta - 2" 
   "Olympus - 3" 
   "Pentax - 4" 
   "Sony"  - 5*/
 if(camera_index == 0)
  {
    Serial.println("canon");
    Canon D5(11);

  }
  if(camera_index == 1)
  {
    Serial.println("nikon");
    Nikon D5000(11);
  }
  if(camera_index == 2)
  {
    Serial.println("minolta");
    Minolta A900(11);
  }
  if(camera_index == 3)
  {
    Serial.println("olympus");
    Olympus E5(11);
  }
  if(camera_index == 4)
  {
    Serial.println("pentax");
    Pentax K7(11);
  }
  if(camera_index == 5)
  {
    Serial.println("sony");
    Sony A900(11);
  }
   
   Serial.println("Scatto con: ");
    //qui eseguo ancora una volta il controllo di camera_index per controllare che segnale ir mandare per far scattare la foto
     if(camera_index == 0)
  {
    Serial.println("canon");
    D5.shutterNow();

  }
  if(camera_index == 1)
  {
    Serial.println("nikon");
    D5000.shutterNow();
  }
  if(camera_index == 2)
  {
    Serial.println("minolta");
    A900.shutterNow()
  }
  if(camera_index == 3)
  {
    Serial.println("olympus");
    E5.shutterNow()
  }
  if(camera_index == 4)
  {
    Serial.println("pentax");
    K7.shutterNow();
  }
  if(camera_index == 5)
  {
    Serial.println("sony");
   A900.shutterNow()
  }

Ma logicamente mi da errore in d5.shutternow() perchè la classe d5 di tipo canon si trova in una codizione if..:confused:

EDIT:

Appena ho postato mi è venuto in mente questo:

camera_index = EEPROM.read(0);

 if(camera_index == 0)
  {
    Serial.println("canon");
    Canon D5(11);
    D5.shutterNow();

  }
  if(camera_index == 1)
  {
    Serial.println("nikon");
    Nikon D5000(11);
    D5000.shutterNow();
  }
  if(camera_index == 2)
  {
    Serial.println("minolta");
    Minolta A900(11);
    A900.shutterNow();
  }
  if(camera_index == 3)
  {
    Serial.println("olympus");
    Olympus E5(11);
    E5.shutterNow();
  }
  if(camera_index == 4)
  {
    Serial.println("pentax");
    Pentax K7(11);
    K7.shutterNow();
  }
  if(camera_index == 5)
  {
    Serial.println("sony");
    Sony A900(11);
   A900.shutterNow();
  }
  • leggo la eeprom e memorizzo l'index in una variabile.
  • ogni volta che devo scattare la foto, vedo l'index e da lì instanzo la classe di riferimento all'index e subito dopo scatto la foto..

Dovrebbe funzionare, devo provare un paio di reflex ora..xD
Non elegantissima come soluzione per ora però.. non mi viene in mente altro per il momento!

Secondo me la soluzione più semplice è quella di scrivere una libreria tua che: 1) carichi la libreria che usi per comandare le reflex; 2) istanzi la classe adeguata alla fotocamera memorizzata in Eeprom e la passi allo sketch sotto forma di classe generica così da usare ad esempio un metodo Reflex.scatto per scattare la foto indipendentemente dal tipo di fotocamera.

PS:
per creare una lib, prendi spunto da qui:

e poi apri e studia una lib già scritta

leo72:
Secondo me la soluzione più semplice è quella di scrivere una libreria tua che: 1) carichi la libreria che usi per comandare le reflex; 2) istanzi la classe adeguata alla fotocamera memorizzata in Eeprom e la passi allo sketch sotto forma di classe generica così da usare ad esempio un metodo Reflex.scatto per scattare la foto indipendentemente dal tipo di fotocamera.

PS:
per creare una lib, prendi spunto da qui:
http://www.arduino.cc/en/Hacking/LibraryTutorial
e poi apri e studia una lib già scritta

Si sarebbe l'ideale, intatno ho seguito i tuoi consigli, mi son studiato per bene il tutorial.. Vediamo che ne uscirà fuori! xD

Allora :slight_smile: , leggendo e studiando diverse librerie (semplicissime) sono arrivato a fare questo:

.cpp

#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

#include "Reflex.h"
#include "C:\arduino\libraries\multiCameraIrControl\multiCameraIrControl.h"

Camera::Camera(int index)
{
                   _index = index;
                   }

//other func
void Camera::scatto()
{    
  if(_index == 0)
  {
 //   Canon D5(13);
   // D5.shutterNow();
  }           
                }

e questo:

.h

#ifndef Reflex_h
#define Reflex_h

#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif



class Camera
{
      public:
           
           Camera (int index);  
            void scatto();
             
      private:
              int _index;
      };
      
#endif

per ora ho ipotizzato di fare uno sketch del genere:

#include <Reflex.h>
Camera reflex(1);

void setup()
{
}

void loop()
{
reflex.scatto();
delay(5000);
}

con Camera reflex(1) istanzio una nuova classe reflex di tipo Camera, la variabile int (che ora è 1) e passo, può diventare una variaible che passo dopo una lettura della eeprom..
Quello che non ho capito è come implementare ed utilizzare libreria esterne per il mio scopo, se noti infatti la parte di codice:

 if(_index == 0)
  {
 //   Canon D5(13);
   // D5.shutterNow();
  }

quelle due righe sono commentate perchè così l'ide arduino mi complila tutto (ma la libreria non fa niente ora xD ) Ma se tolgo i commeti logicamente mi da errore..

Non ho capito quindi se quando mi hai detto di includere la libreria che uso dovrei agire in questo modo?

Grazie!

EDIT: Nello sketch andava incluso anche <multiCameraIrControl.h> , ora credo funzioni! Una cosa però, ma grosso modo è quello che mi avevi consigliato? xD

EDIT2: Ho proceduto e ho apportato qualche ulteriore modifica, tipo il fatto di decidere su quale pin mandare il segnale ir.. Ho zippato tutto e lo allego, se non ti dispiace vorrei lo provassi, volevo sapere se è esatto il metodo di includere le altre librerie in questo modo..
C'è anche un file di esempio.. xD

ReflexIrSend.7z (3.41 KB)

Domani vedo se riesco a provarlo.