Interrupteur intelligent pour WC

1000 uF, désolé. Tout est expliqué ici

re! petite absence de quelques semaines/mois suite à la préparation et à la réalisation d'un roadtrip de +1000km
sur 9 jours en skate électrique tout terrain avec des potes. Rien à voir avec le sujet (bien que l'on ait de l'arduino pour l'affichage de la batterie etc) mais çà a été énorme.

Entre temps, j'ai pas mal avancé et testé beaucoup de choses:

  1. le capteur PIR ne convient pas, je passe pas mal de temps dans mon "donjon", immobile en regardant le portable et devoir gigoter ou agiter le bras à la fin de la temporisation me gave légèrement.
    Je suis passé sur un capteur ultrason HC-SR04 qui sera placé sur le mur du fond des wc. testé et approuvé, il réagit à merveille.

Pas mal de galères avec le RTC 3231, après pas mal d'essais infructueux sans raison apparente (du moins pour moi), changements de librairies etc, je me suis aperçu que le serial.begin n'était pas le bon. En même temps cela m'a permis d'apprendre. Désormais à l'heure et bien paramétré.

Aujourd’hui c'est mise en place de toutes les conditions et essais.

Ou ça le road trip ?

lesept:
Ou ça le road trip ?

on a fait avec 4 potes 1080 km entre Paris et Bordeaux en skates électriques tout terrain du 20 au 29 juin, avec près de 30 kg chacun de matos/pièces de rechange/chargeurs/tentes/fringues etc.
Juste génial! Un peu moins pendant la semaine de canicule sous 42 degrés, finish sur une double fracture d'un des participants. Mais on a bien rigolé et profité :slight_smile:

Concernant le code, je m'y suis attaqué et je bloque un peu (la noobitude).
si je peux le poster pour des commentaires constructifs et voir ou j'ai fauté?

// RTC DS3231 + SR04 Ultrasonic sensor + WS2812B leds strip
// le but est d'allumer automatiquement les leds en utilisant le capteur ultrason, le module RTC sous 3 conditions:
// condition 1: si obstacle détecté dans la plage de distance définie à 1.60m (= distance du mur du fond des wc à porte des wc - 5cm)
//              dans la plage horaire 23h31 et 6h30 alors allumage des leds en blanc à 30%
// condition 2: si obstacle détecté dans la plage de distance définie à 1.60m (= distance du mur du fond des wc à porte des wc - 5cm)
//              dans la plage horaire 6h31 et 23h30 alors allumage des leds en blanc à 100%
// condition 3: si pas d'obstacle détecté, alors pas d'allumage des leds.


#include "RTClib.h"  
#include <Wire.h>
#include <FastLED.h>  
#define NUM_LEDS 260  // définir le nombre de leds du ruban
#define DATA_PIN 6   // definir le pin data du ruban leds

RTC_DS3231 rtc;

CRGB leds[NUM_LEDS]; 

const int trigPin = 9;  // pin trigger du capteur ultrason
const int echoPin = 10;  // pin echo du capteur ultrason



void setup() { 
  
 rtc.begin(); // Initialisation du module rtc
 Wire.begin(); //Démarrage de la librairie wire.h
 pinMode(trigPin, OUTPUT); // pin trigger du sr04 en sortie
 pinMode(echoPin, INPUT); // pin echo du sr04 en entrée
 Serial.begin(9600); // début de la communication en série
 FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // ajout des infos des leds, type, pin de data, nombre de leds

 if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
 }
 
 if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
void loop() {
  //Heure actuel
  DateTime now = rtc.now();
  
  
  //  etablissement des variables pour la durée du ping
  //  et la distance  en pouces et cm
  long duration, inches, cm;
 
  // le capteur est activé par un pulse en position haute 
  // de 10 ms minimum
  // pour s'assurer d'une réelle activation, on 
  // définit un pulse bas en entrée.
  
  pinMode(trigPin, OUTPUT);  // pin trigger défini en sortie
  digitalWrite(trigPin, LOW);  // on décrit la position originale du pin de sortie du capteur en bas
  delayMicroseconds(2); //  pause de 2ms
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);

 



  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
// condition 1: si distance inférieure ou égale à 160cm + n'importe quel jour de la semaine 
//entre 23h31 et 6h30 allumage des leds en blanc à 30%

  if (cm <= 160) && (now.dayOfTheWeek() == 1, 2, 3, 4, 5, 6, 7 && now.hour() >=23 && now.minute() >=31) && (now.dayOfTheWeek () == 1, 2, 3, 4, 5, 6, 7 && now.hour () <= 06 && now.minute ()>=30){fill_solid( &(leds[0]), NUM_LEDS, CRGB(85, 85, 85);
}
 FastLED.show();

// condition 2: si distance inférieure ou égale à 160cm + n'importe quel jour de la semaine 
//entre 6h31 et 23h30 allumage des leds en blanc à 100%

  if (cm <= 160) && (now.dayOfTheWeek() == 1, 2, 3, 4, 5, 6, 7 && now.hour() >=06 && now.minute() >=31) && (now.dayOfTheWeek () == 1, 2, 3, 4, 5, 6, 7 && now.hour () <= 23 && now.minute ()<=30){fill_solid( &(leds[0]), NUM_LEDS, CRGB(250, 250, 250);
}
 FastLED.show();

  
}
 
else if (cm >= 161) {fill_solid( &(leds[0]), NUM_LEDS, CRGB::Black);
 FastLED.show();
}
delay(100);
}

et là erreur sur la 2eme condition lors de la compilation alors que la typo est la même.
"expected identifier before '(' token"
désolé si ca parait bête... en attendant je continue de chercher :wink:

C'est la première fois que je vois ça

now.dayOfTheWeek () == 1, 2, 3, 4, 5, 6, 7

Puisque les valeurs possibles sont entre 0 et 7, je te conseille de remplacer par

now.dayOfTheWeek () != 0

Pas besoin de mettre des FastLED.show partout, un seul suffit, à la fin de tes if, en dehors des accolades.

J'imagine que tu n'as pas pris l'A10 ! Par où êtes vous passés ?

Merci de ta réponse rapide,
J’essaierai ta solution après la nuit de boulot :slight_smile:

Pour le trip, départ de Paris Montparnasse, coulée verte jusqu’à Massy, routes et chemins champêtres jusqu’a Artenay la première journée.
Même type de route jusqu’a Orléans, le long de la Loire jusqu’a Amboise, éco velo jusqu’a La Rochelle puis descente jusqu’a Bordeaux le long de l’atlantique. Chaque nuit en camping pour recharger les énormes batteries (20kg chacun)
On se fait Bordeaux-Carcassonne en octobre quand le blessé sera remis, mais nous devrions être beaucoup plus nombreux (20-25).
(Si tu veux jeter un œil, pour la com’ et les sponsors nous avons une page FB « Banana Riders » ^^ »

Chouette. J'aurais pu te voir à Massy, j'habite à deux pas de la coulée verte. Le long de la Loire ça devait être sympa...

C'était vraiment sympa, 14 mois de préparation, tracé à faire km par km sur Google Maps, adaptation des boards pour avoir + de couple au détriment de la Vmax.
Oui sympa les bords de Loire, on a pu profiter du paysage vu qu’on se « traînait » à 35km/maxi pour moins consommer (D’habitude en ride on est plus sur une moyenne de 45-50 avec des pointes à +80 pour certains)

Bonjour lesept,

lesept:
C'est la première fois que je vois ça

now.dayOfTheWeek () == 1, 2, 3, 4, 5, 6, 7

J'ai essayé :

int now = 0;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 50 ; i++) {
    now = i;
    if (now == 1,2,3) {
      Serial.println(now);
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Cela imprime de 0 à 49.

Il y a un warning à la compilation ( IDE 1.8.9 Windows 10 64b):

C:\Users\PHILIP~1\AppData\Local\Temp\arduino_modified_sketch_104257\sketch_jul29a.ino: In function 'void setup()':

C:\Users\PHILIP~1\AppData\Local\Temp\arduino_modified_sketch_104257\sketch_jul29a.ino:7:13: warning: left operand of comma operator has no effect [-Wunused-value]

if (now == 1,2,3) {

^

C:\Users\PHILIP~1\AppData\Local\Temp\arduino_modified_sketch_104257\sketch_jul29a.ino:7:20: warning: right operand of comma operator has no effect [-Wunused-value]

if (now == 1,2,3) {

^

Cordialement,
bidouilleelec

Bon cette nuit au boulot, cela a été assez calme donc j'en ai profité pour une modif du code.
Mais toujours la même erreur "exit status 1 expected identifier before '(' token" sur la ligne de commande de la 2ème condition après compilation. Je continue de fouiller (enfin ce sera après quelques heures de sommeil) mais j'avoue que je sèche un peu. le plus frustrant est de savoir que la solution doit être bidon..

// RTC DS3231 + SR04 Ultrasonic sensor + WS2812B leds strip
// le but est d'allumer automatiquement les leds en utilisant le capteur ultrason, le module RTC sous 3 conditions:
// condition 1: si obstacle détecté dans la plage de distance définie à 1.60m (= distance du mur du fond des wc à porte des wc - 5cm)
//              dans la plage horaire 23h31 et 6h30 alors allumage des leds en blanc à 30%
// condition 2: si obstacle détecté dans la plage de distance définie à 1.60m (= distance du mur du fond des wc à porte des wc - 5cm)
//              dans la plage horaire 6h31 et 23h30 alors allumage des leds en blanc à 100%
// condition 3: si pas d'obstacle détecté, alors pas d'allumage des leds.


#include <DS3231.h>  
#include <Wire.h>
#include <FastLED.h>  
#define NUM_LEDS 260  // définir le nombre de leds du ruban
#define DATA_PIN 6   // definir le pin data du ruban leds


DS3231 rtc(SDA, SCL) ;

Time t ;

const int OnHour1 = 06;  // heure de debut période 1
const int OnMin1 = 30;  // minutes de début période 1
const int OffHour1 = 23;  // heure de fin période 1 
const int OffMin1 = 30;  // minutes de fin période 1

const int OnHour2 = 23; // heure de début période 2
const int OnMin2 = 31;  // minutes de début période 2
const int OffHour2 = 06;  // heure de fin période 2
const int OffMin2 = 29;  //minutes de fin période 2

 

CRGB leds[NUM_LEDS]; 

const int trigPin = 9;  // pin trigger du capteur ultrason
const int echoPin = 10;  // pin echo du capteur ultrason

 

void setup() { 
  
 rtc.begin(); // Initialisation du module rtc
 Wire.begin(); //Démarrage de la librairie wire.h
 pinMode(trigPin, OUTPUT); // pin trigger du sr04 en sortie
 pinMode(echoPin, INPUT); // pin echo du sr04 en entrée
 Serial.begin(9600); // début de la communication en série
 FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // ajout des infos des leds, type, pin de data, nombre de leds
}



void loop() {
//  etablissement des variables pour la durée du ping
  //  et la distance  en pouces et cm
  long duration, inches, cm;
 


// The sensor is triggered by a HIGH pulse of 
  //10 or more microseconds.
  // Give a short LOW pulse beforehand to 
  //ensure a clean HIGH pulse:
  pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  duration = pulseIn(echoPin, HIGH);
  pinMode(echoPin, INPUT);
 

 
  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
 
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();


  
t = rtc.getTime();
Serial.print(t.hour);
Serial.print("hour(s), ");
Serial.print(t.min);
Serial.print("minute(s)");
Serial.println(" ");

delay(1000);


  
// condition 1: si distance inférieure ou égale à 160cm 
//entre 6h30 et 23h30 allumage des leds en blanc à 100%
if (cm <=160) && ((t.hour >= OnHour1 && t.min >= OnMin1) && (t.hour <=OffHour1 && t.min <= OffMin1))
      {fill_solid( &(leds[0]), NUM_LEDS, CRGB( 255, 255, 255));
}

// condition 2: si distance inférieure ou égale à 160cm
//entre 23h31 et 6h29 allumage des leds en blanc à 30%
if (cm <=160) && ((t.hour >= OnHour2 && t.min >= OnMin2) && (t.hour <=OffHour2 && t.min <= OffMin2))
      {fill_solid( &(leds[0]), NUM_LEDS, CRGB( 85, 85, 85));
}

else if (cm >= 161)
      {fill_solid( &(leds[0]), NUM_LEDS, CRGB( 0, 0, 0));
 }
FastLED.show();
delay(100);
}
long microsecondsToInches(long microseconds)
{
// According to Parallax's datasheet for the PING))), there are
// 73.746 microseconds per inch (i.e. sound travels at 
//1130 feet per second).  This gives the distance travelled 
//by the ping, outbound and return, so we divide by 2 to get the 
//distance of the obstacle. 
//See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}
 
long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per
  // centimeter. The ping travels out and back, so to find 
  //the distance of the object we take half of the distance 
  //travelled.
  return microseconds / 29 / 2;
}

Bonjour,

Il manque une parenthèse ici

  if (cm <= 160) && ((t.hour >= OnHour2 && t.min >= OnMin2) && (t.hour <= OffHour2 && t.min <= OffMin2))
  { fill_solid( &(leds[0]), NUM_LEDS, CRGB( 85, 85, 85));

Ce devrait être

  if ((cm <= 160) && ((t.hour >= OnHour2 && t.min >= OnMin2) && (t.hour <= OffHour2 && t.min <= OffMin2))
  { fill_solid( &(leds[0]), NUM_LEDS, CRGB( 85, 85, 85));

Un conseil: enlève toutes ces parenthèses qui ne servent à rien

  if (cm <= 160 && t.hour >= OnHour2 && t.min >= OnMin2 && t.hour <= OffHour2 && t.min <= OffMin2)

Pour comparer des heures et minutes, il est plus simple de tout transformer en minutes écoulées depuis minuit. Tu calcules t.hour * 60 + t.min et tu le compares à la valeur qui t'intéresse.

Pour comparer à 6h30 : 660+30 = 390, et à 23h30 : 2360+30 = 1410

Ça donne une condition simplifiée : ceci

if (cm <= 160) && ((t.hour >= OnHour1 && t.min >= OnMin1) && (t.hour <= OffHour1 && t.min <= OffMin1))

devient

if (cm <= 160 && t.hour * 60 + t.min >= OnHour1 * 60 + OnMin1 && t.hour * 60 + t.min <= OffHour1 * 60 + OffMin1)

ou bien, mieux :

int maintenant = t.hour * 60 + t.min;
if (cm <= 160 && maintenant >= 390 && maintenant <= 1410)

Ton test de l'heure est incorrect, ce devrait être ça

 if (cm <= 160 && (t.hour > OnHour2 || (t.hour == OnHour2 && t.min >= OnMin2)) && (t.hour < OffHour2 || (t.hour == OffHour2 && t.min <= OffMin2)))
  { fill_solid( &(leds[0]), NUM_LEDS, CRGB( 85, 85, 85));

Si je ne me suis pas trompé (car effectuer un test sur l'heure et la minute est assez compliqué).

Si tu ne veux pas te faire des nœuds au cerveau, je te conseille de convertir en minutes ou alors d'utiliser cette formule que j'aime bien
heureComp=100*heure+minute
C'est très pratique car 6:30 devient 630 et tu peux faire les comparaisons directement sans te casser la tête avec les && et les ||.

Oups: grillé par le sept.

Tu m'avais grillé pour les parenthèses, alors...

Bon pas moyen de dormir... vais déguster au taf cette nuit. Bref.
Super méthodes que de compter les minutes depuis minuit ou de faire des entiers avec les heures+minutes. Je n’y avais pas pensé et croyais naïvement que le plus simple était de délimiter des plages horaires sous la forme « de x heure à x heure » même si cela revient au même. Pourquoi faire compliqué quand on peut faire simple. Nouvel essai d’endormissement avant de tester sur des périodes plus courtes que tout fonctionne (déjà plus de message d’erreur lors de la compilation ce qui est bon signe) puis installation dans la « salle du trône ».
Vraiment merci, je posterai le code en finish.