Go Down

Topic: Problemone con PROGMEM :( (Read 10561 times) previous topic - next topic

roxdragon

Code: [Select]
void ReadFlash(uint16_t *x){
  unsigned int buffer[256];

  byte lenght = sizeof(x)/sizeof(int);
  for (byte i=0; i < lenght; i++){
    buffer[i] = pgm_read_word( &(x[i]));        // forse senza &
  }
   My_Sender.IRsendRaw::send(buffer, lenght, khz);
}

in void loop
Code: [Select]
if ( readString.indexOf("C=30") > 0 )
          ReadFlash(&IR);

cosa sbaglio??
compilatore:
Code: [Select]
sketch_arduino_con_raw.ino: In function 'void loop()':
sketch_arduino_con_raw:125: error: cannot convert 'const uint16_t* (*)[29]' to 'uint16_t*' for argument '1' to 'void ReadFlash(uint16_t*)'

nid69ita


Code: [Select]
sketch_arduino_con_raw.ino: In function 'void loop()':
sketch_arduino_con_raw:125: error: cannot convert 'const uint16_t* (*)[29]' to 'uint16_t*' for argument '1' to 'void ReadFlash(uint16_t*)'


Questo è quel che dicevo che forse il compilatore non gradiva. Comunque:
1. NON può funzionare quel calcolo di length dentro la funzione. Fidati. Ti compila ma il calcolo sarà errato.
2. Se utilizzi la sintassi con le quadre in alcune parti e in altre passi alla sintassi puntatori con * fai un macello
3. IR essendo un array è GIA' un puntatore, perciò:
Code: [Select]
ReadFlash(IR);
my name is IGOR, not AIGOR

nid69ita

#32
Mar 27, 2014, 05:02 pm Last Edit: Mar 27, 2014, 05:19 pm by nid69ita Reason: 1
Prova così:
Code: [Select]
void ReadFlash(const uint16_t *x , byte len)
{ unsigned int buffer[256];
 for (byte i=0; i < len; i++) {
   buffer[i] = pgm_read_word( &(x+i) );
 }
 My_Sender.IRsendRaw::send(buffer, len, khz);
}


La chiamata:
Code: [Select]
if ( readString.indexOf("C=30") > 0 )
         ReadFlash(IR, VDIM(IR) );


In testa al programma:
Code: [Select]

#define VDIM(v) (sizeof(v)/sizeof((v[0]))
my name is IGOR, not AIGOR

roxdragon

fatto ma ottengo questi errori:
Code: [Select]
sketch_arduino_con_raw:63: error: expected `)' before '{' token
sketch_arduino_con_raw.ino: In function 'void ReadFlash(const uint16_t*, byte)':
sketch_arduino_con_raw:67: error: 'lenght' was not declared in this scope
sketch_arduino_con_raw:68: error: lvalue required as unary '&' operand
sketch_arduino_con_raw:70: error: 'lenght' was not declared in this scope
sketch_arduino_con_raw.ino: In function 'void loop()':
sketch_arduino_con_raw:125: error: cannot convert 'const uint16_t**' to 'const uint16_t*' for argument '1' to 'void ReadFlash(const uint16_t*, byte)'

nid69ita

Ho corretto sopra.  Riprova.
my name is IGOR, not AIGOR

roxdragon

#35
Mar 27, 2014, 05:29 pm Last Edit: Mar 27, 2014, 05:55 pm by roxdragon Reason: 1
ecco l'errore del compilatore:
Code: [Select]
sketch_arduino_con_raw.ino: In function 'void ReadFlash(const uint16_t*, byte)':
sketch_arduino_con_raw:66: error: lvalue required as unary '&' operand
sketch_arduino_con_raw.ino: In function 'void loop()':
sketch_arduino_con_raw:123: error: expected `)' before ';' token



facendo cosi
Code: [Select]
   buffer[i] = pgm_read_word( &x+i );

rimane solo l'errore in riga 123 che sarebbe qui
Code: [Select]
           ReadFlash(IR,VDIM(IR));          

scusa mi sorge un dubbio...
avendo io questi:

Code: [Select]
if ( readString.indexOf("C=30") > 0 )
           ReadFlash(IR,VDIM(IR));          
if ( readString.indexOf("C=29") > 0 )
           ReadFlash(IR,VDIM(IR));          
if ( readString.indexOf("C=28") > 0 )
           ReadFlash(IR,VDIM(IR));          
if ( readString.indexOf("C=27") > 0 )
           ReadFlash(IR,VDIM(IR));    
ecc.ecc...      

come faccio a modificare il codice per dirgli che quando
if ( readString.indexOf("C=30") > 0 )
deve leggere la stringa C30?  o se C=29 deve leggere e inviare la 29? ecc        

nid69ita

Questa l'ho corretta sopra, mancava una tonda:
Code: [Select]
#define VDIM(v) (sizeof(v)/sizeof((v[0]))

Se non metti tutto il codice, tu hai scritto IR, io che ne sò che cosa è.
Tu devi fare le "associazioni":
Code: [Select]
if ( readString.indexOf("C=30") > 0 )
            ReadFlash(C30,VDIM(C30));           
if ( readString.indexOf("C=29") > 0 )
            ReadFlash(C29,VDIM(C29)); 
my name is IGOR, not AIGOR

roxdragon

#37
Mar 27, 2014, 06:41 pm Last Edit: Mar 27, 2014, 07:52 pm by roxdragon Reason: 1
Code: [Select]
         if ( readString.indexOf("C=30") > 0 )
           ReadFlash(C30,VDIM(C30)
[code]void ReadFlash(const uint16_t *x , byte len){
 unsigned int buffer[256];
 for (byte i=0; i < len; i++) {
   buffer[i] = pgm_read_word( &x+i );
 }
 My_Sender.IRsendRaw::send(buffer, len, khz);
}
 non va... però compila... perche?

Code: [Select]

   buffer[i] = pgm_read_word( x+i );
   Serial.println(buffer[i]);
 }
 My_Sender.IRsendRaw::send(buffer, len, khz);
}


togliendo &
modificando cosi, sulla seriale riesco a vedere tutto l'array C30 però non invia il codice, cioè non mi si accende il condizionatore mentre con questo codice si:

Code: [Select]
void loop(){
byte lenght = sizeof(C30)/sizeof(int);
           for (byte i=0; i < lenght; i++)
           {
             buffer[i] = pgm_read_word( &C30[i] );        // forse senza &
            }
            My_Sender.IRsendRaw::send(buffer, lenght, khz);
[/code]


EDIT Adesso funziona tutto correttamente... se ho problemi riscrivo... spero di no
Grazie a tutti ragazzi siete stati gentilissimi :D

nid69ita

Sarebbe utile ad altri con lo stesso problema se tu avessi voglia di postare ed allegare il tuo codice funzionante (penso sia lungo perciò magari meglio allegarlo zippato o compresso con winrar).  :)
my name is IGOR, not AIGOR

pablos71

continuo a non capire perchè non hai preso il code hex e ripetuto con la libreria IRremote  :smiley-surprise:
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

nid69ita


continuo a non capire perchè non hai preso il code hex e ripetuto con la libreria IRremote  :smiley-surprise:


Perchè non funziona. Con i telecomandi tipo tv tutto okay, ma sembra che i condizionatori spediscano una quantità micidiale di dati che la IRRemote non riesce a gestire.
Alla fine @rox  spedisce i dati raw, ma presi da telecomando usando AnalysIR, un software per PC interessante, assieme a un sketch Arduino o Raspy. Venduto a 7€.  
my name is IGOR, not AIGOR

pablos71

#41
Mar 27, 2014, 10:11 pm Last Edit: Mar 27, 2014, 10:37 pm by pablos Reason: 1
Quote
sembra che i condizionatori spediscano una quantità micidiale di dati che la IRRemote non riesce a gestire.

sono 32 bit lo puoi fare comunque anche a 6000 bit basta solo impostare bene la lib, ci sono anche diversi post che dimostrano come fare. Diciamo allora che è un ripiego per non sbattersi troppo  XD, però per un progetto più complesso non resta spazio utilizzando tutta sta memoria, (posso andare da Milano a Roma passando da Venezia) a mio parere è una via funzionante ma non è la via migliore.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

nid69ita

No, seguendo altri post sullo stesso problema, da quel che ho capito, il condizionatore non vuole solo il comando on/off ma anche altri dati dal telecomando. 32 o 48 byte non bastano. Almeno questo è quello che io ho capito.
www.analysir.com/blog/2014/03/19/air-conditioners-problems-recording-long-infrared-remote-control-signals-arduino/
my name is IGOR, not AIGOR

roxdragon

Ragazzi scusate sono tornato adesso a casa, che emozione!
Ho acceso il mio condizionatore ad aria calda da remoto in VPN cosi ho trovato la stanza calda...
Adesso che ho risolto voglio spiegarvi qualcosa.
Chris, di AnalysIR mi ha detto appunto che è meglio utilizzare IRLib perchè Irremote è valida per i telecomandi classici.
Il condizionatore oltre ad inviare on e off nella decodifica ci sta tutto tra cui la ventola, caldo, freddo, timer ecc... ecco perchè sono molto più lunghi.
Comunque se a qualcuno puo interessare ecco cosa ho fatto!




Mi sono fatto un app per Android e tramite una VPN controllo il tutto, posso controllare anche luci etc..!!!
Sto espandendo il mio progetto, sto lavorando adesso con lo speech recognizer, in modo da accendere tutto a voce!!!

leo72

Carino. Bravo!
Come sicurezza, hai improntato un qualche tipo di controllo per evitare connessioni indesiderate?

Go Up