====== 4 relais pour commande de projecteurs de diapo en mode aléatoire ====== ===== Version ESP8266 ===== * esp Wemos mini D1 * Platine 4 relais on se branche sur la fiche du projecteur 2,3 , détrompeur en bas, en commençant a gauche, impulsion courte pour diapo suivante , longue pour diapo précédente. Le tiroir contient 50 diapositives Sur les sorties 2,0,13,14 => D4,D3,D7,D5 attention au temps ms d'appui bouton pour diapo suivante et precedente selon le projecteur j'y ai un début de fonction OSC /* Diaporobot gepeto@du-libre.org 2020 Automate de commande de relais pour des impulsions de commande pour 4 projecteurs de diapositives Matériel: ESP Wemos + platine 4 relais */ #include #include //#include //#include // OSC //#include //#include //#include //#include // /////////////////////////////////////////////////////////// // DEFINITION DU diaporobot A MODIFIER // // int sortie[9] = {16, 5, 4, 0, 2, 14, 12, 13, 15}; // sortie possible // 0,1,2... ok pour 1,2,4,5,6,7 pas 0 3 8 int sortie[9] = {15, 2, 0, 13, 14, 5, 12, 13, 4}; int tiroir[6] = {50, 50, 50, 50, 50, 50}; // nbr de diapo dans les chargeurs int sens[6] = {1, 1, 1, 1, 1, 1}; //sens de passage du tiroir int freq_mini[6] = {30, 30, 30, 30, 30, 30}; // min 30s entre 2 diapo int freq_maxi[6] = {180, 180, 180, 180, 180, 180}; // max 180 int idx_diapo[6] = {1, 1, 1, 1, 1, 1}; // index dans le chargeur de diapo int freq_diapo[6] = {1, 1, 1, 1, 1, 1}; // nbr ( s) entre 2 diapo int idx_bcl_diapo[6] = {1, 1, 1, 1, 1, 1}; // num de la boucle en cours uint32_t bton_court = 200 ; //temps ms d'appui bouton pour diapo suivante uint32_t bton_long = 1000 ; //temps ms d'appui bouton pour diapo precedente // SI OSC // nom DIAPOROBOT-1 pour IP 192.168.0.121 // DIAPOROBOT-2 pour IP 192.168.0.122 etc // const char* nomhost = "DIAPOROBOT-1"; IPAddress diaporobot_ip(192, 168, 0, 121); char osc_port[6] = "9005"; // si besoin const char* ssid = "SNHACK"; const char* password = "opopop"; /////// FIN ////////////////////////////////////////////// ////////////////////////////////////////////////////////// /*IPAddress mask(255, 255, 255, 0); IPAddress passerelle(192, 168, 0, 1); const char DEVICE_NAME[] = "DIAPOROBOT"; int osc_port_int = 0; WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP const IPAddress outIp(192, 168, 1, 3); // remote IP to receive OSC IPAddress _ip; OSCErrorCode error; bool shouldSaveConfig = true; */ /* //converts the pin to an osc address char * numToOSCAddress(int pin) { static char s[10]; int i = 9; s[i--] = '\0'; do { s[i] = "0123456789"[pin % 10]; --i; pin /= 10; } while (pin && i); s[i] = '/'; return &s[i]; } void saveConfigCallback () { Serial.println("Should save config"); shouldSaveConfig = true; } void mod_idx_bcl(OSCMessage & msg) {// IDX ff projo position dans le chargeur long proj = (long) msg.getFloat(0); long idx = (long) msg.getFloat(1); if (idx <= 0 || idx >= tiroir) idx_diapo[proj] = 1; idx_diapo[proj] = idx; } void arreter(OSCMessage & msg) { } */ ////////////////// OSC commandes////////////// /* void diapo_boucle(OSCMessage & msg) { Serial.println("/DIAPO"); long dia = (long) msg.getFloat(0); if (dia <= 0 || dia >= 5) { dia = 1; } if (dia == 1) { tk_bcl_diapo_1.detach(); tk_bcl_diapo_1.attach_ms(1000 * dia, pulse_dia_pin_1); } if (dia == 2) { tk_bcl_diapo_2.detach(); tk_bcl_diapo_2.attach_ms(1000 * dia, pulse_dia_pin_2); } if (dia == 3) { tk_bcl_diapo_3.detach(); tk_bcl_diapo_3.attach_ms(1000 * dia, pulse_dia_pin_3); } if (dia == 4) { tk_bcl_diapo_4.detach(); tk_bcl_diapo_4.attach_ms(1000 * dia, pulse_dia_pin_4); } } */ void setup(void) { Serial.begin(115200); //set led pin as output pinMode(BUILTIN_LED, OUTPUT); //pinMode(Bouton_init, INPUT); //BoutonParam = HIGH; Serial.println((int32_t)ESP.getChipId()); delay(1000); int BoutonParam = analogRead(A0); // a cause de OSC sur purdata on garde que des float ! Serial.println(F("sorties : 2,0,13,14")); Serial.println(F("init des sorties")); for (int i = 0; i <= 8; i++) { // //ok pour 1,2,4,5,6,7 if ( i == 3 || i == 8) continue ; pinMode(sortie[i], OUTPUT); //analogWrite(sortie[i], 0); digitalWrite(sortie[i], HIGH); } //WiFiManager /* on fixe tout pour installation WiFiManager wifiManager; if (BoutonParam >= 15) { Serial.println(F("PARAM ")); //reset saved settings wifiManager.resetSettings(); Serial.println(F("WIfi param reset ")); //ticker.attach_ms(1000*0.2, tick); //set custom ip for portal //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); } //fetches ssid and pass from eeprom and tries to connect //if it does not connect it starts an access point with the specified name //here "AutoConnectAP" //and goes into a blocking loop awaiting configuration wifiManager.autoConnect(DEVICE_NAME); //or use this for auto generated name ESP + ChipID //wifiManager.autoConnect(); */ WiFi.disconnect(); /* Serial.print(F("ssid : ")); Serial.println(ssid); WiFi.begin(ssid, password); WiFi.mode(WIFI_STA); WiFi.hostname(nomhost); // DHCP Hostname (useful for finding device for static lease) WiFi.config(diaporobot_ip, passerelle, mask); // (DNS not required) while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } osc_port_int = atoi(osc_port); Serial.println(F("TOUT OK WiFi connected! IP address: ")); Serial.println(WiFi.localIP()); Serial.println(WiFi.hostname()); Serial.print(F("sur port :")); Serial.println(osc_port); delay(100); Udp.begin(osc_port_int); Serial.print(F("Local port: ")); Serial.println(Udp.localPort()); */ // for (int idx = 1; idx <= 4; idx++) { freq_diapo[idx] = (int)random(freq_mini[idx], freq_maxi[idx]); // frequence //idx_bcl_diapo[idx] = 1; // nbr de boucle en cours //idx_diapo[idx] = 1; // position dans le chargeur digitalWrite(sortie[idx], HIGH); Serial.print(" sortie: "); Serial.println(sortie[idx]); } } void loop() { /* //////////// OSC //////////////////////// //reads and dispatches the incoming message OSCMessage msgIN; int size; //char puce_char[] = " "; if ( (size = Udp.parsePacket()) > 0) { while (size--) msgIN.fill(Udp.read()); if (!msgIN.hasError()) { msgIN.dispatch("/IDX", mod_idx_bcl); // /IDX ff projo position_diapo_ds le chargeur msgIN.dispatch("/stop", arreter); Serial.println(size); } else { error = msgIN.getError(); Serial.print("error: "); Serial.println(error); } Udp.flush(); } */ /// une boucle fait 1 en gros seconde delay(1000); for (int i = 1; i <= 4; i++) { if (sens[i] < 0) Serial.print("-"); Serial.print(idx_diapo[i]); Serial.print("\t"); Serial.print(idx_bcl_diapo[i]); Serial.print("/"); Serial.print(freq_diapo[i]); if (idx_bcl_diapo[i] == freq_diapo[i] ) { // frequence ok? digitalWrite(sortie[i], LOW); Serial.print(" "); Serial.print(sortie[i]); Serial.print(" "); if (sens[i] > 0) { Serial.print(" AVV "); delay(bton_court); } else { Serial.print(" ARR "); delay(bton_long); } digitalWrite(sortie[i], HIGH); idx_diapo[i] += 1; idx_bcl_diapo[i] = 0; Serial.print(" chg bcl "); freq_diapo[i] = (int)random(freq_mini[i], freq_maxi[i]); Serial.print(freq_diapo[i]); } idx_bcl_diapo[i] += 1; if (idx_diapo[i] >= tiroir[i]) { // si arrive au bout du chargeur change de sens idx_diapo[i] = 1; sens[i] = -sens[i]; Serial.print(" tiroir"); } Serial.println("."); } Serial.println("---"); } ===== Version arduino ===== **Sortie 9,10,11,13** /* Arduino Uno * commande alléatoire de relais pour projecteur de diapo * 1 ou 2 carte de 4 relais */ // ESP8266 int sortie[9] = {16, 5, 4, 0, 2, 14, 12, 13, 15}; // sortie possible // 0,1,2... ok pour 1,2,4,5,6,7 pas 0 3 8 int nbr_relais = 4; // si une carte 4 relais int sortie[9] = {13, 9, 10, 11, 13, 13, 11, 13, 13}; int tiroir[9] = {50, 50, 50, 50, 50, 50}; // nbr de diapo dans les chargeurs int sens[9] = {1, 1, 1, 1, 1, 1}; //sens de passage du tiroir int freq_mini[9] = {30, 30, 30, 30, 30, 30}; // min 30s entre 2 diapo int freq_maxi[9] = {180, 180, 180, 180, 180, 180}; // max 180 int idx_diapo[9] = {1, 1, 1, 1, 1, 1}; // index dans le chargeur de diapo int freq_diapo[9] = {1, 1, 1, 1, 1, 1}; // nbr ( s) entre 2 diapo int idx_bcl_diapo[9] = {1, 1, 1, 1, 1, 1}; // num de la boucle en cours uint32_t bton_court = 200 ; //temps ms d'appui bouton pour diapo suivante uint32_t bton_long = 1000 ; //temps ms d'appui bouton pour diapo precedente void setup() { Serial.begin(115200); for (int i = 0; i <= nbr_relais; i++) { // //ok pour 1,2,4,5,6,7 // ESP if ( i == 3 || i == 8) continue ; pinMode(sortie[i], OUTPUT); //analogWrite(sortie[i], 0); digitalWrite(sortie[i], HIGH); Serial.print(" "); Serial.print(sortie[i]); } Serial.println(""); Serial.println("Test"); for (int i = 1; i <= nbr_relais; i++) { delay(1000); digitalWrite(sortie[i], HIGH); delay(bton_court); digitalWrite(sortie[i], LOW); delay(bton_court); digitalWrite(sortie[i], HIGH); } Serial.println("init random"); for (int idx = 1; idx <= nbr_relais; idx++) { freq_diapo[idx] = (int)random(freq_mini[idx], freq_maxi[idx]); // frequence //idx_bcl_diapo[idx] = 1; // nbr de boucle en cours //idx_diapo[idx] = 1; // position dans le chargeur digitalWrite(sortie[idx], HIGH); Serial.print(" sortie: "); Serial.print(sortie[idx]); Serial.print(" delai: "); Serial.println(freq_diapo[idx]); } Serial.println("10s"); delay(10000); } void loop() { delay(1000); for (int i = 1; i <= nbr_relais; i++) { if (sens[i] < 0) Serial.print("-"); Serial.print(idx_diapo[i]); Serial.print("\t"); Serial.print(idx_bcl_diapo[i]); Serial.print("/"); Serial.print(freq_diapo[i]); if (idx_bcl_diapo[i] == freq_diapo[i] ) { // frequence ok? digitalWrite(sortie[i], LOW); Serial.print(" "); Serial.print(sortie[i]); Serial.print(" "); if (sens[i] > 0) { Serial.print(" AVV "); delay(bton_court); } else { Serial.print(" ARR "); delay(bton_long); } digitalWrite(sortie[i], HIGH); idx_diapo[i] += 1; idx_bcl_diapo[i] = 0; Serial.print(" chg bcl "); freq_diapo[i] = (int)random(freq_mini[i], freq_maxi[i]); Serial.print(freq_diapo[i]); } idx_bcl_diapo[i] += 1; if (idx_diapo[i] >= tiroir[i]) { // si arrive au bout du chargeur change de sens idx_diapo[i] = 1; sens[i] = -sens[i]; Serial.print(" tiroir"); } Serial.println("."); } Serial.println("---"); }