nid69ita:
Ora, la sendNEC() vuole solo 2 valori, un unsigned long e un int, non puoi passarli 3 valori:
void sendNEC(unsigned long data, int nbits);
Se vuoi spedire 5 valori DEVI fare un loop e spedire un valore alla volta, prendendo dal tuo vettore AC116A0
for(int i=0;i<=4;i++)
{ irsend.sendNEC( AC116A0[i], 24);
}
Allora, è meglio che ti spiego bene quello che ho fatto.
Il telecomando che ho clonato è a 120 bit, mentre la send nec per come è strutturata mi consente l'invio di solamente 32 bit e anche scrivendo 120 dove chiedeva Nbits al massimo me ne trovavo comunque 32, infatti dopo aver fatto due conti, unsigned long al max contiene 32 bit. Quindi ho modificato nella libreria la funzione SendNec per far si di inviare tutti i 120 bit semplicimente dividendoli in 5 insiemi che inviati tutti assieme vanno a formare un comando unico. Da qui questa costante:
AC120A0[]={0x6A2E00,0x000400,0x000000,0x000000,0x000018};
Ti faccio vedere la parte di libreria che ho modificato:
void IRsend::sendNEC(unsigned long data[], int insiemi, int nbits)
{
unsigned long temp;
enableIROut(38);
mark(NEC_HDR_MARK);
space(NEC_HDR_SPACE);
for (int datai = 0; datai < insiemi ; datai++) {
temp = data[datai];
for (int i = 0; i < nbits; i++) {
if (temp & TOPBIT2) {
mark(NEC_BIT_MARK);
space(NEC_ONE_SPACE);
}
else {
mark(NEC_BIT_MARK);
space(NEC_ZERO_SPACE);
}
temp <<= 1;
}
}
mark(NEC_BIT_MARK);
space(0);
}
ecco il perchè di quel 5 e il 24 che altrimenti non dovrebbero starci.
Il 5 è il numero di insiemi che compone il comando intero, mentre il 24 è il numero di bit che compone ogni insieme.
temp è una variabile in cui viene copiato momentaneamente l'insieme per essere spedito e shiftato senza modificare il comando originale.
Facendo così
for(int i=0;i<=4;i++)
{ irsend.sendNEC( AC116A0[i], 24);
}
Mi ritroverei che per ogni insieme mi invia il bit di controllo e quello di start, se non sbaglio.
Comunque come ho fatto funziona, mi invia il comando e riesco a controllare il condizionatore.
Il codice che ho usato per testare la modifica e uso per controllare il condizionatore è questo:
/*
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
* An IR LED must be connected to Arduino PWM pin 3.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
#include <IRremote.h>
const int buttonPin = 7 ; // the number of the pushbutton pin
// Variables will change:
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50;
unsigned long data[]={0x6A2E00,0x000400,0x000000,0x000000,0x000018};
IRsend irsend;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
// set initial LED state
}
void loop() {
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
// set the LED:
irsend.sendNEC(data, 5, 24);
Serial.println("Ok");
}
}
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = reading;
}
che è il codice di esempio debounce adattato per far si che alla pressione del pulsante invece di accendere il led invia la sendnec. E con questo funziona, se voglio modificare il comando basta modificare i sei insiemi esadecimali della variabile data.
Quello che io voglio fare è creare una lista di costanti e far si che alla modifica di una variabile che può essere la temperatura, il modo, la ventola ecc corrisponda la stringa che richiami la costante corrispondente a quel comando e la invii. Praticamente invece di chiamarla data, o pippo o chicchesia, chiamarla AC (che corrisponderebbe al mode) (1 o 0 allo stato acceso o spento), (20 la temperatura che non andrebbe mai sotto il 16), (A lo stato della ventola) e (1 o 0 lo stato dello sleep mode).
Spero di essermi spiegato meglio di come mi son spiegato sino ad ora.
I comandi li ho mappati tutti a mano, quindi devo farne una lista che andrebbe richiamata a seconda degli stati di quelle variabili.
Grazie per il tempo che mi stai dedicando.