Bonjour,
Comme c'est mon premier message sur ce forum, je me présente un chouille : Julien, 30 ans du Tarn.
Je débute avec arduino et peut être que je passe à coté de quelque chose car j'ai un soucis que je classe dans la catégorie "bisarerie bisard".
Je me suis procuré un arduino mini pro et un programmateur FTDI qui va bien et j'ai réalisé mon premier programme qui quand je le téléverse, fonctionne exactement comme je le souhaite. Si je débranche le programmateur et que je le rebranche (simplement pour alimenter mon montage), le sketch démarre normalement mais j'ai l'impresion que le timer se bloque et comme tout est basé sur lui, tout est bloqué...
Au niveau composants, actuellement j'ai 5 leds (que je vais remplacer par des cartes de puissance plus tard) et un bouton poussoir avec un anti rebond materiel.
Voici mon code :
#include "Timer.h"
Timer t;
int led = 13;
int brassage_1 = 4;
int brassage_2 = 5;
int distribution_1 = 6;
int distribution_2 = 7;
int capteur_niveau = 9;
int vidange = 10;
int bouton_mode = 2;
int bac_2 = 8;
int mode = 0;
int scenario = 0;
int temps_distribution = 5;
int nb_distribution = 3;
int temps_pause_distribution = 20;
int temps_capteur_niveau = 30;
int nb_courant = 0;
int temps_courant = 0;
int bac_2_valeur = HIGH;
int capteur_courant = 0;
int ledEvent;
void setup()
{
pinMode(led, OUTPUT);
pinMode(brassage_1, OUTPUT);
pinMode(brassage_2, OUTPUT);
pinMode(distribution_1, OUTPUT);
pinMode(distribution_2, OUTPUT);
pinMode(vidange, OUTPUT);
pinMode(bouton_mode, INPUT_PULLUP);
pinMode(bac_2, INPUT_PULLUP);
pinMode(capteur_niveau, INPUT);
attachInterrupt(0, action_manuelle, FALLING);
t.every(1000, time);
}
void loop()
{
t.update();
}
void action_manuelle()
{
switch(mode)
{
case 0: // Off
bac_2_valeur = digitalRead(bac_2);
t.stop(ledEvent);
ledEvent = t.oscillate(led, 1000, LOW);
digitalWrite(brassage_1, HIGH);
if(bac_2_valeur == LOW)
{
digitalWrite(brassage_2, HIGH);
}
mode = 1;
break;
case 1: // Brassage
t.stop(ledEvent);
ledEvent = t.oscillate(led, 100, LOW);
digitalWrite(brassage_1, LOW);
if(bac_2_valeur == LOW)
{
digitalWrite(brassage_2, LOW);
}
nb_courant = nb_distribution;
scenario = 1;
mode = 2;
break;
}
}
void time() { // debut de la fonction d'interruption Timer2
if(temps_courant == 0)
{
switch(scenario)
{
case 1: // allume la distribution 1
digitalWrite(distribution_1, HIGH);
temps_courant = temps_distribution;
scenario = 2;
break;
case 2: // eteint la distribution 1
digitalWrite(distribution_1, LOW);
if(nb_courant == 0)
{
if(bac_2_valeur == LOW)
{
scenario = 3;
nb_courant = nb_distribution;
}else{
scenario = 5;
}
}else{
scenario = 1;
nb_courant = nb_courant - 1;
}
temps_courant = temps_pause_distribution;
break;
case 3: // allume la distribution 2
digitalWrite(distribution_2, HIGH);
temps_courant = temps_distribution;
scenario = 4;
break;
case 4: // eteint la distribution 2
digitalWrite(distribution_2, LOW);
if(nb_courant == 0)
{
scenario = 5;
}else{
scenario = 3;
nb_courant = nb_courant - 1;
}
temps_courant = temps_pause_distribution;
break;
case 5:
t.stop(ledEvent);
t.oscillate(led, 5000, LOW);
mode = 0;
scenario = 6;
break;
}
}else{
temps_courant = temps_courant - 1;
}
int capteur_niveau_valeur = digitalRead(capteur_niveau);
if(capteur_niveau_valeur == HIGH)
{
capteur_courant = temps_capteur_niveau;
digitalWrite(vidange, HIGH);
}
if(capteur_courant == 0)
{
digitalWrite(vidange, LOW);
}else{
capteur_courant = capteur_courant - 1;
}
}