jeedom += F("&ADCO=");
timeout = millis()+1000;
while (timeout>millis())
{
if (teleinfo.available())
{
recu = teleinfo.read() & 0x7F;
#if (DEBUGtoSERIAL == 1)
DebugSerial.print(recu);
#endif
cntChar++;
if (cntChar > 280) break;
if (recu == 0) break;
if (recu == 0x04) break; // EOT
if (recu == 0x03) break; // permet d'eviter ce caractere dans la chaine envoyée (economise du code pour le traiter)
if (recu == 0x0A) continue; // Debut de groupe
if (recu == 0x0D)
{
jeedom += ';'; // Fin de groupe
continue;
}
if (recu<33)
{
jeedom += '_';
}
else jeedom += recu;
}
}
teleinfo.end();
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("/finRX"));
#endif
PinNextSend[i]=millis()+120000; // Delai 120s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#if (UseBMP180 == 1)
case 'r': // BMP085/180
if (PinNextSend[i] < millis())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bmp.readTemperature();
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bmp.readPressure();
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#if (UseBME280 >= 1)
#if (UseBME280 != 2)
case 'A': // BME280
if (PinNextSend[i] < millis())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bme280.readTemperature();
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bme280.readPressure();
jeedom += '&';
jeedom += i + 2000;
jeedom += '=';
jeedom += bme280.readHumidity();
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#if (UseBME280 >= 2)
case 'D': // BME280
if (PinNextSend[i] < millis())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bme280b.readTemperature();
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bme280b.readPressure();
jeedom += '&';
jeedom += i + 2000;
jeedom += '=';
jeedom += bme280b.readHumidity();
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#endif
#if (UseBME680 >= 1)
#if (UseBME680 != 2)
case 'B': // BME680
if (PinNextSend[i] < millis() and bme680.performReading())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bme680.temperature;
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bme680.pressure;
jeedom += '&';
jeedom += i + 2000;
jeedom += '=';
jeedom += bme680.humidity;
jeedom += '&';
jeedom += i + 3000;
jeedom += '=';
jeedom += bme680.gas_resistance;
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#if (UseBME680 >= 2)
case 'E': // BME680
if (PinNextSend[i] < millis() and bme680b.performReading())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bme680b.temperature;
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bme680b.pressure;
jeedom += '&';
jeedom += i + 2000;
jeedom += '=';
jeedom += bme680b.humidity;
jeedom += '&';
jeedom += i + 3000;
jeedom += '=';
jeedom += bme680b.gas_resistance;
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#endif
#if (UseBMP280 >= 1)
#if (UseBMP280 != 2)
case 'C': // BMP280
if (PinNextSend[i] < millis())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bmp280.readTemperature();
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bmp280.readPressure();
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#if (UseBMP280 >= 2)
case 'F': // BMP280
if (PinNextSend[i] < millis())
{
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += bmp280b.readTemperature();
jeedom += '&';
jeedom += i + 1000;
jeedom += '=';
jeedom += bmp280b.readPressure();
PinNextSend[i] = millis() + ProbePauseDelay; // Delai 60s entre chaque mesures pour eviter trop d'envois
}
break;
#endif
#endif
}
}
#if (UserSketch == 1)
//UserLoop(); // Appel de votre loop() permanent
if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s
#endif
if (NextRefresh < millis())
{
NextRefresh = millis() + 60000; // Refresh auto toutes les 60s
if (RepByJeedom) // sert a verifier que jeedom a bien repondu a la demande dans Load_eeprom
{
jeedom += F("&ASK=1"); // Sinon on redemande
}
}
// #if (UseLCD16x2 == 1 || UseLCD16x2 == 2)
// lcd.setCursor(0,1);
// lcd.print(jeedom);
// #endif
if (jeedom!="") SendToJeedom();
}
//// User Loop + Action
#if (UserSketch == 1)
void UserLoop()
{
// Votre loop()
// pour envoyer une valeur a jeedom, il suffit de remplir la variable jeedom comme cela :
// jeedom += '&';
// jeedom += u; // avec u = numero de la pin "info" dans l'equipement jeedom - info pin number
// jeedom += '=';
// jeedom += info; // la valeur a envoyer - info value to send
//
// Ex:
// jeedom += '&';
// jeedom += 500; // Etat pin 500
// jeedom += '=';
// jeedom += '1'; // '0' ou '1'
//
// jeedom += '&';
// jeedom += 504; // pin 504
// jeedom += '=';
// jeedom += millis(); // valeur numerique
//
// jeedom += '&';
// jeedom += 506; // pin 506
// jeedom += '=';
// jeedom += "Jeedouino%20speaking%20to%20Jeedom..."; // valeur string
// /!\ attention de ne pas mettre de code bloquant (avec trop de "delays") - max time 2s
}
void UserAction()
{
// En cas d'une reception d'une commande user action depuis jeedom
// c[0]='U' & c[n]='R')
//
// c[1] = c[1] - '0'; ==5 (user pin start at 500)
// c[2] = c[2] - '0';
// c[3] = c[3] - '0';
// ou : for (int i = 1; i < n; i++) if (isDigit(c[i])) c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
// int pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // pin action number
//
// c[4] to c[n-1] // pin action value
//
// Ex1:
// JEEDOM : Sortie Numérique (Sous-type Jeedom: défaut)
// ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
// ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
// Ex2:
// JEEDOM : Sortie Numérique (Sous-type Jeedom: curseur)
// ARDUINO : c[] = U502128R -> U 502 128 R = Slider, Value 128, pin 502 -> c[4] = '1', c[5] = '2', c[5] = '8'
// Ex3:
// JEEDOM : Sortie Numérique (Sous-type Jeedom: message)
// ARDUINO : c[] = U507[Jeedom] Message|Ceci est un testR -> U 507 [Jeedom] Message | Ceci est un test R = Message, pin 507
// /!\ attention de ne pas mettre de code bloquant (avec trop de "delays") - max time 2s
}
#endif
// FONCTIONS
void SendToJeedom()
{
Serial.println(jeedom);
#if (DEBUGtoSERIAL == 1)
DebugSerial.print(F("\nSending: "));
DebugSerial.println(jeedom);
DebugSerial.print(F("\nTo eqLogic: "));
DebugSerial.println(eqLogic);
#endif
delay(333);
jeedom="";
}
void Set_OutputPin(int i)
{
TempoPinHIGH[i]=0;
TempoPinLOW[i]=0;
switch (Status_pins[i])
{
#if (UseServo == 1)
case 'x':
pinTempo = 100 * int(c[3]) + 10 * int(c[4]) + int(c[5]);
myServo[i].write(pinTempo);
delay(15);
break;
#endif
case 'o': // output // S131S pin 13 set to 1 (ou S130S pin 13 set to 0)
case 'l': // low_relais // S13S pin 13 set to 0
case 'h': // high_relais // S13S pin 13 set to 1
if (c[3]==0)
{
PinWriteLOW(i);
}
else
{
PinWriteHIGH(i);
}
break;
case 's': // switch // S13 pin 13 set to 1 si 0 sinon set to 0 si 1
if (swtch[i]==1)
{
PinWriteLOW(i);
}
else
{
PinWriteHIGH(i);
}
break;
//
// ON VERIFIE SI UNE TEMPORISATION EST DEMANDEE SUR UNE DES SORTIES
// On essai d'etre sur une precision de 0.1s mais ca peut fluctuer en fonction de la charge cpu
// Testé seulement sur mega2560
//
case 'u': // output_pulse // Tempo ON : S1309999S : pin 13 set to 0 during 999.9 seconds then set to 1 (S1319999 : set to 1 then to 0)
pinTempo=10000*int(c[4])+1000*int(c[5])+100*int(c[6])+10*int(c[7])+int(c[8]);
// pinTempo est donc en dixieme de seconde
pinTempo = pinTempo*100+millis(); // temps apres lequel la pin doit retourner dans l'autre etat.
// Peut buguer quand millis() arrive vers 50jours si une tempo est en cours pendant la remise a zero de millis().
// Risque faible si les tempo sont de l'ordre de la seconde (impulsions sur relais par ex.).
if (c[3]==0)
{
TempoPinHIGH[i]=pinTempo;
PinWriteLOW(i);
}
else if (c[3]==1)
{
TempoPinLOW[i]=pinTempo;
PinWriteHIGH(i);
}
break;
case 'v': // low_pulse // Tempo ON : S139999S : pin 13 set to 0 during 999.9 seconds then set to 1
if (c[3]==0)
{
pinTempo=10000*int(c[4])+1000*int(c[5])+100*int(c[6])+10*int(c[7])+int(c[8]);
// pinTempo est donc en dixieme de seconde
pinTempo = pinTempo*100+millis(); // temps apres lequel la pin doit retourner dans l'autre etat.
TempoPinHIGH[i]=pinTempo;
PinWriteLOW(i);
}
else
{
PinWriteHIGH(i);
}
break;
case 'w': // high_pulse // Tempo ON : S139999S : pin 13 set to 1 during 999.9 seconds then set to 0
if (c[3]==0)
{
PinWriteLOW(i);
}
else
{
pinTempo=10000*int(c[4])+1000*int(c[5])+100*int(c[6])+10*int(c[7])+int(c[8]);
// pinTempo est donc en dixieme de seconde
pinTempo = pinTempo*100+millis(); // temps apres lequel la pin doit retourner dans l'autre etat.
TempoPinLOW[i]=pinTempo;
PinWriteHIGH(i);
}
break;
case 'm': // pwm_output
pinTempo = 100 * int(c[3]) + 10 * int(c[4]) + int(c[5]); // the duty cycle: between 0 (always off) and 255 (always on).
analogWrite(i, pinTempo);
jeedom += '&';
jeedom += i;
jeedom += '=';
jeedom += pinTempo;
break;
}
}
void Load_EEPROM(int k)
{
// on recupere le BootMode
BootMode = EEPROM.read(14);
// Recuperation de l'eqLogic
eqLogic = F("IDeqLogic");
eqLogic0 = "";
n = EEPROM.read(15); // Recuperation de la longueur du eqLogic
if (n > 0) // bug probable si eqLogic_id<10 dans jeedom
{
for (int i = 1; i < n; i++)
{
eqLogic0 += EEPROM.read(15 + i);
}
}
if (eqLogic != eqLogic0)
{
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("Reinit eqID etc"));
DebugSerial.println();
#endif
Init_EEPROM();
}
// Recuperation de l'IP
IP_JEEDOM[0]=EEPROM.read(26);
IP_JEEDOM[1]=EEPROM.read(27);
IP_JEEDOM[2]=EEPROM.read(28);
IP_JEEDOM[3]=EEPROM.read(29);
// on met en place le mode des pins
jeedom = "";
byte y = 1;
#if (UseTeleInfo == 1)
teleinfoRX = 0;
teleinfoTX = 0;
#endif
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("Conf. Pins:"));
for (int i = 0; i < NB_TOTALPIN; i++) DebugSerial.print((char)EEPROM.read(30 + i));
DebugSerial.println();
#endif
// au cas ou l'arduino n'ai pas encore recu la conf. des pins.
// for (int i = 2; i < NB_TOTALPIN; i++)
// {
// byte e = EEPROM.read(30 + i);
// if (e < ' ' || e > 'z')
// {
// jeedom += F("&PINMODE=1");
// #if (DEBUGtoSERIAL == 1)
// DebugSerial.println(F("Demande la Conf. Pins."));
// DebugSerial.println();
// #endif
// break;
// }
// }
for (int i = 2; i < NB_TOTALPIN; i++)
{
Status_pins[i] = EEPROM.read(30 + i); // Etats des pins
// INITIALISATION DES TABLEAUX DE TEMPO SORTIES
TempoPinHIGH[i] = 0;
TempoPinLOW[i] = 0;
//
switch (Status_pins[i])
{
case 'i': // input
OLDPinValue[i] = 2; //@cpaillet
PinNextSend[i] = millis();
break;
case 'a': // analog_input
case 'n': // BP_input_pulldown
pinMode(i, INPUT);
break;
#if (UseTeleInfo == 1)
case 'j': // teleinfoRX pin
teleinfoRX = i;
pinMode(i, INPUT);
break;
case 'k': // teleinfoTX pin
teleinfoTX = i;
pinMode(i, OUTPUT);
break;
#endif
#if (UseDHT == 1)
case 'd': // DHT11
myDHT[i] = new DHT(i, 11); // DHT11
PinNextSend[i] = millis() + ProbePauseDelay;
break;
case 'e': // DHT21
myDHT[i] = new DHT(i, 21); // DHT21
PinNextSend[i] = millis() + ProbePauseDelay;
break;
case 'f': // DHT 22
myDHT[i] = new DHT(i, 22); // DHT22
PinNextSend[i] = millis() + ProbePauseDelay;
break;
#endif
#if (UseDS18x20 == 1)
case 'b': // DS18x20
PinNextSend[i] = millis() + ProbePauseDelay;
break;
#endif
#if (UseServo == 1)
case 'x':
myServo[i].attach(i);
break;
#endif
case 't': // trigger pin
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
break;
case 'z': // echo pin
pinMode(i, INPUT);
break;
case 'p': // input_pullup
pinMode(i, INPUT_PULLUP);
OLDPinValue[i] = 2; //@cpaillet
PinNextSend[i] = millis();
break;
case 'g': // pwm_input
case 'q': // BP_input_pullup
pinMode(i, INPUT_PULLUP); // pour eviter les parasites en lecture, mais inverse l'etat de l'entree : HIGH = input open, LOW = input closed
// Arduino Doc : An internal 20K-ohm resistor is pulled to 5V.
swtch[i] = 0; // init pour pwm_input
OLDPinValue[i] = 1;
PinNextSend[i] = millis();
break;
case 'c': // compteur_pullup
pinMode(i, INPUT_PULLUP); // pour eviter les parasites en lecture, mais inverse l'etat de l'entree : HIGH = input open, LOW = input closed
// Arduino Doc : An internal 20K-ohm resistor is pulled to 5V.
if (k)
{
jeedom += F("&CPT_"); // On demande à Jeedom de renvoyer la dernière valeur connue pour la pin i
jeedom += i;
jeedom += '=';
jeedom += i;
}
break;
case 'o': // output
case 's': // switch
case 'l': // low_relais
case 'h': // high_relais
case 'u': // output_pulse
case 'v': // low_pulse
case 'w': // high_pulse
case 'y': // double_pulse
pinMode(i, OUTPUT);
// restauration de l'etat des pins DIGITAL OUT au demarrage
if (k)
{
switch (BootMode)
{
case 0:
// On laisse tel quel
break;
case 1:
PinWriteLOW(i);
break;
case 2:
PinWriteHIGH(i);
break;
case 3:
PinWriteHIGH(i);
// On demade a Jeedom d'envoyer la valeur des pins
if (y)
{
jeedom += F("&ASK=1");
y=0;
RepByJeedom=1; // sert a verifier que jeedom a bien repondu a la demande
}
break;
case 4:
if (EEPROM.read(110+i) == 0) PinWriteLOW(i);
else PinWriteHIGH(i);
break;
case 5:
PinWriteLOW(i);
// On demade a Jeedom d'envoyer la valeur des pins
if (y)
{
jeedom += F("&ASK=1");
y=0;
RepByJeedom=1; // sert a verifier que jeedom a bien repondu a la demande
}
break;
}
}
// fin restauration
break;
case 'm': // pwm_output
pinMode(i, OUTPUT);
break;
}
}
#if (UseTeleInfo == 1)
if (teleinfoRX != 0)
{
#if (DEBUGtoSERIAL == 1)
DebugSerial.print(F("\nteleinfoRX:"));
DebugSerial.println(teleinfoRX);
DebugSerial.print(F("\nteleinfoTX:"));
DebugSerial.println(teleinfoTX);
#endif
//SoftwareSerial teleinfo(teleinfoRX, teleinfoTX);
}
#endif
if (jeedom != "") SendToJeedom();
}
void PinWriteHIGH(long p)
{
digitalWrite(p, HIGH);
swtch[p]=1;
jeedom += '&';
jeedom += p;
jeedom += F("=1");
// Si bootmode=4 sauvegarde de l'etat de la pin (en sortie) - !!! Dangereux pour l'eeprom à long terme !!!
if (BootMode==4) EEPROM.update(110+p, 1);
#if (DEBUGtoSERIAL == 1)
DebugSerial.print(F("SetPin "));
DebugSerial.print(p);
DebugSerial.println(F(" to 1"));
#endif
}
void PinWriteLOW(long p)
{
digitalWrite(p, LOW);
swtch[p]=0;
jeedom += '&';
jeedom += p;
jeedom += F("=0");
// Si bootmode=4 sauvegarde de l'etat de la pin (en sortie) - !!! Dangereux pour l'eeprom à long terme !!!
if (BootMode==4) EEPROM.update(110+p, 0);
#if (DEBUGtoSERIAL == 1)
DebugSerial.print(F("SetPin "));
DebugSerial.print(p);
DebugSerial.println(F(" to 0"));
#endif
}
void Init_EEPROM()
{
// Un marqueur
EEPROM.update(13, 'J'); // JEEDOUINO
// BootMode choisi au demarrage de l'arduino
// 0 = Pas de sauvegarde - Toutes les pins sorties non modifi�es au d�marrage.
// 1 = Pas de sauvegarde - Toutes les pins sorties mises � LOW au d�marrage.
// 2 = Pas de sauvegarde - Toutes les pins sorties mises � HIGH au d�marrage.
// 3 = Sauvegarde sur JEEDOM - Toutes les pins sorties mises suivant leur sauvegarde dans Jeedom. Jeedom requis, sinon pins mises � OFF.
// 4 = Sauvegarde sur EEPROM- Toutes les pins sorties mises suivant leur sauvegarde dans l\'EEPROM. Autonome, mais dur�e de vie de l\'eeprom fortement r�duite.
EEPROM.update(14, 2);
BootMode=2;
// Initialisation par default
EEPROM.update(15, 0);
for (int i = 16; i < 200; i++)
{
EEPROM.update(i, 1); // Valeur des pins OUT au 1er demarrage ( mes relais sont actis a 0, donc je met 1 pour eviter de les actionner au 1er boot)
}
// fin initialisation
}
#if (UseDS18x20 == 1)
int read_DSx(int pinD)
{
byte data[12];
byte addr[8];
long first, temp;
char buffer[3];
OneWire ds(pinD);
byte nb_ds18 = 0;
ds.reset_search();
while (ds.search(addr))
{
if (OneWire::crc8(addr, 7) != addr[7]) //Check if there is no errors on transmission
{
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("CRC invalide..."));
#endif
return 9999;
}
if (addr[0] != 0x28)
{
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("Device is not a DS18B20."));
#endif
return 9999;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
nb_ds18++;
delay(250);
}
if (nb_ds18 == 0)
{
ds.reset_search();
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(F("ds not found..."));
#endif
return 9999;
}
nb_ds18 = 0;
delay(800);
jeedom = F("&DS18list_");
jeedom += pinD;
jeedom += F("={");
ds.reset_search();
while (ds.search(addr))
{
jeedom += '"';
jeedom += F("28-");
for (int ii = 6; ii > 0; ii--)
{
if (addr[ii] < 16) jeedom += '0';
itoa (addr[ii], buffer, 16);
jeedom += buffer;
}
jeedom += '"';
jeedom += ':';
jeedom += '"';
ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int ii = 0; ii < 9; ii++)
{
data[ii] = ds.read();
}
temp = (int16_t) ((data[1] << 8) | data[0]) * 6.25;
if (nb_ds18 == 0) first = temp;
nb_ds18++;
#if (DEBUGtoSERIAL == 1)
DebugSerial.println(temp / 100);
#endif
jeedom += temp;
jeedom += '"';
jeedom += ',';
}
jeedom += '}';
return first;
}
#endif
#if (UseWS2811 == 1)
// Code below is from https://github.com/adafruit/Adafruit_NeoPixel/blob/master/examples/buttoncycler/buttoncycler.ino
// More info at https://github.com/adafruit/Adafruit_NeoPixel
void startShow(int i) {
switch(i){
case 0: colorWipe(strip.Color(0, 0, 0), 50); // Black/off
break;
case 1: colorWipe(strip.Color(255, 0, 0), 50); // Red
break;
case 2: colorWipe(strip.Color(0, 255, 0), 50); // Green
break;
case 3: colorWipe(strip.Color(0, 0, 255), 50); // Blue
break;
case 4: colorWipe(strip.Color(255, 255, 255), 50); // White
break;
case 5: colorWipe(strip.Color(255, 255, 0), 50); // Magenta
break;
case 6: colorWipe(strip.Color(255, 0, 255), 50); // Yellow
break;
case 7: colorWipe(strip.Color(0, 255, 255), 50); // Cyan
break;
case 8: theaterChase(strip.Color(127, 0, 0), 50); // Red
break;
case 9: theaterChase(strip.Color(0, 127, 0), 50); // Green
break;
case 10: theaterChase(strip.Color(0, 0, 127), 50); // Blue
break;
case 11: theaterChase(strip.Color(127, 127, 127), 50); // White
break;
case 12: theaterChase(strip.Color(127, 127, 0), 50); // Magenta
break;
case 13: theaterChase(strip.Color(127, 0, 127), 50); // Yellow
break;
case 14: theaterChase(strip.Color(0, 127, 127), 50); // Cyan
break;
case 15: rainbow(20);
break;
case 16: rainbowCycle(20);
break;
case 17: theaterChaseRainbow(50);
break;
}
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<10; j++) { //do 10 cycles of chasing
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
#endif
puis je l’ai reconnecté l’arduino au pi j’ai fait des test de actionnement mais je n’ai rien qui fonctionne
d’ou cela peut venir?