====== 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("---");
}