#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // On Trinket or Gemma, suggest changing this to 1
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16 // Popular NeoPixel ring size
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define centrale1departcycle 12 // arduino 0 PD0 a modifier sur version finale
#define centrale1etat 13 // arduino 1 PD1 a modifier sur version finale
#define machine1departcycle PD2 // arduino 2
#define machine1findecycle PD3 // arduino 3
#define centrale2departcycle PD4 // arduino 4
#define centrale2etat PD5 // arduino 5
#define machine2departcycle 8 // arduino 8 PB0 a modifier sur version finale
#define machine2findecycle 9 // arduino 9 PB1
#define led PD6 // arduino 6
#define tempo1 PC0 // arduino A0
#define tempo2 PC1 // arduino A1
#define tempswatchdog 800000 // durée du watchdog au départ d'un cycle en minutes
#define delaisantirebond 200 // delais d'attente entre deux deux prise en compte des entrées
void setup() {
//declaration des modes E/S des broches
pinMode(centrale1departcycle, INPUT_PULLUP);
pinMode(centrale2departcycle, INPUT_PULLUP);
pinMode(machine1findecycle, INPUT_PULLUP);
pinMode(machine2findecycle, INPUT_PULLUP);
pinMode(tempo1, INPUT);
pinMode(tempo2, INPUT);
pinMode(centrale1etat, OUTPUT);
pinMode(centrale2etat, OUTPUT);
pinMode(machine1departcycle, OUTPUT);
pinMode(machine2departcycle, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(centrale1etat, LOW);
digitalWrite(centrale2etat, LOW);
digitalWrite(machine1departcycle, LOW);
digitalWrite(machine2departcycle, LOW);
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
Serial.begin(9600); //debug only
}
void loop() {
static uint8_t memoireentrees = 0; // bit 0 centrale1departcycle; 1 centrale2departcycle; 2 machine1findecycle; 3 machine2findecycle
static uint8_t memoiresorties = 0; // bit 0 centrale1etat; 1 centrale2etat; 2 machine1departcycle; 3 machine2departcycle
static uint8_t departcycle = 0; // bit 0 machine 1, 1 machine 2
static uint8_t memoirewatchdog = 0; // // bit 0 machine 1, 1 machine 2
static uint16_t tempsdecycle1 = 0, tempsdecycle2 = 0;
static uint32_t watchdog1 = 0, watchdog2 = 0; // watchdog des cycles des machines 1 et 2
static uint32_t tempssechoir1 = 0, tempssechoir2 = 0;
static uint8_t memoiresechoir = 0;
static uint16_t nombredecyclessechoir1 = 0, nombredecyclessechoir2 = 0;
static uint32_t antirebondsechoir = 0;
static uint8_t memoireboutonsechoir = 0;
// lecutre des entrées puis mise en mémoire
tempsdecycle1 = analogRead(tempo1); //gestion du temps d'activation (sechoirs)
tempsdecycle2 = analogRead(tempo2); //gestion du temps d'activation (sechoirs)
bitWrite(memoireentrees, 0, !digitalRead(centrale1departcycle));
bitWrite(memoireentrees, 1, !digitalRead(centrale2departcycle));
bitWrite(memoireentrees, 2, !digitalRead(machine1findecycle));
bitWrite(memoireentrees, 3, !digitalRead(machine2findecycle));
pixels.clear(); // Set all pixel colors to 'off'
//verification des watchdogs et des temps sechoir
//machine 1
if (millis() - watchdog1 > tempswatchdog or millis() - watchdog1 > tempssechoir1) {
bitWrite(memoirewatchdog, 0, 1);
nombredecyclessechoir1 = 0;
}
//machine 2
if (millis() - watchdog2 > tempswatchdog or millis() - watchdog2 > tempssechoir2) {
bitWrite(memoirewatchdog, 1, 1);
}
// gestion des temps de marche des sechoirs
if (tempsdecycle1 > 23) { // si le potentiomètre est au delas de 23/1023 on active la fonction sechoir
// on compte le nombre d'impultions de marche
if (bitRead(memoireentrees, 0) == 1 and millis() and memoireboutonsechoir == 0) { // si on commande la mise en marche et que la commande à été relachée depuis la derniere boucle
antirebondsechoir = millis(); // on stock la valeur millis de depart
memoireboutonsechoir = 1;
nombredecyclessechoir1++;
if (nombredecyclessechoir1 > 5) {
nombredecyclessechoir1 = 5; // limite à 5 le nombre de cycles
}
}
if (nombredecyclessechoir1 > 0) {
tempssechoir1 = (tempsdecycle1 / 80) * 1000.0 * nombredecyclessechoir1;
} else {
tempssechoir1 = (tempsdecycle1 / 80) * 1000.0;
}
if (memoireboutonsechoir == 1 and bitRead(memoireentrees, 0) == 0 and millis() - antirebondsechoir > delaisantirebond) {
memoireboutonsechoir = 0;
}
}
else{
tempssechoir1 = tempswatchdog;
}
if (tempsdecycle2 > 23) {
bitWrite(memoiresechoir, 1, 1);
} else {
bitWrite(memoiresechoir, 1, 0);
}
//action a réaliser sur modification des entrées
//Machine 1
if (bitRead(memoireentrees, 0) == 1 and bitRead(departcycle, 0) == 0) { // si debut de cycle et pas de cycle en cours
bitWrite(departcycle, 0, 1); // le bit de marche de la machine 1 est mis a 1
watchdog1 = millis(); // initialisation du watchdog machine 1
bitWrite(memoirewatchdog, 0, 0);
bitWrite(memoiresorties, 0, 1); //la sortie vers la centrale etat machine 1 est mise a 1
bitWrite(memoiresorties, 2, 1); //la sortie vers depart machine 1 est mise a 1
}
if (bitRead(memoireentrees, 2) == 1 or bitRead(memoirewatchdog, 0) == 1) { //action réaliés en cas de fin de cycle ou d'activation du watchdog
bitWrite(departcycle, 0, 0);
bitWrite(memoiresorties, 0, 0); //la sortie vers la centrale etat machine 1 est mise a 0
bitWrite(memoiresorties, 2, 0); //la sortie vers depart machine 1 est mise a 0
}
//Machine 2
if (bitRead(memoireentrees, 1) == 1 and bitRead(departcycle, 1) == 0) { // si debut de cycle et pas de cycle en cours
bitWrite(departcycle, 1, 1); // le bit de marche de la machine 2 est mis a 1
watchdog2 = millis(); // initialisation du watchdog machine 2
bitWrite(memoirewatchdog, 1, 0);
bitWrite(memoiresorties, 1, 1); //la sortie vers la centrale etat machine 2 est mise a 1
bitWrite(memoiresorties, 3, 1); //la sortie vers depart machine 2 est mise a 1
}
if (bitRead(memoireentrees, 3) == 1 or bitRead(memoirewatchdog, 1) == 1) { //action réaliés en cas de fin de cycle ou d'activation du watchdog
bitWrite(departcycle, 1, 0); // arret du signal de depart cycle machine
bitWrite(memoiresorties, 1, 0); //la sortie vers la centrale etat machine 2 est mise a 0
bitWrite(memoiresorties, 3, 0); //la sortie vers depart machine 2 est mise a 0
}
//ecriture des sorties
digitalWrite(centrale1etat, bitRead(memoiresorties, 0));
digitalWrite(centrale2etat, bitRead(memoiresorties, 1));
digitalWrite(machine1departcycle, bitRead(memoiresorties, 2));
digitalWrite(machine2departcycle, bitRead(memoiresorties, 3));
//Gestion des LEDs WS2812
pixels.setPixelColor(0, pixels.Color(0, 255, 0));
for (int i = 0 ; i < 2; i++){
pixels.setPixelColor(i, pixels.Color(0, bitRead(memoiresorties, i) * 255, 0));
}
pixels.show(); // Send the updated pixel colors to the hardware.
//moniteur serie a retirer sur la version prod
if (millis() % 500 == 0) {
Serial.print("sechoir 1 : ");
Serial.println(tempssechoir1);
Serial.println(millis() - watchdog1);
Serial.println(nombredecyclessechoir1);
}
}