hello
vous auriez aussi pu faire un générateur de fréquences avec un deuxième arduino. fréquence réglable par potentiomètre.
voici le code
attention, il y a des attributions de pins à respecter pour travailler sur les ports
si questions, n'hésitez pas.
#define BP_forcage A1 //BP sera cablé: GND, BP, D3
#define impulsions_R 2 //entrée interruptible INT0
#define impulsions_F 3 //entrée interruptible INT1
//code pour UNO. 4, 5, 6, 7 impératifs pour les commandes leds/bobines
#define led_1 4 //port C bit 4 cablage obligatoire sur D4
#define led_2 5 //port C bit 5 cablage obligatoire sur D5
#define led_3 6 //port C bit 6 cablage obligatoire sur D6
#define led_4 7 //port C bit 7 cablage obligatoire sur D7
//code pour UNO. 8,9,10,11 impératifs pour sélecteur
#define selecteur_1 8 //port B bit 0 cablage obligatoire sur D8 sera cablé: GND, sélecteur, D8
#define selecteur_2 9 //port B bit 1 cablage obligatoire sur D9 sera cablé: GND, sélecteur, D9
#define selecteur_3 10 //port B bit 2 cablage obligatoire sur D10 sera cablé: GND, sélecteur, D10
#define selecteur_4 11 //port B bit 3 cablage obligatoire sur D11 sera cablé: GND, sélecteur, D11
#define capteur_analogique A0 //
boolean bridage=false;
int state = 0;
int val = 0;
int mode = 0; //sera initialisé en fonction sélecteur/sonde analogique
int cpt_state = 0; //pour le retour à la normale
int volatile comptage_impulsion = 0;
void isr_impulsion_R() {comptage_impulsion++;}//comptage des impulsions
void isr_impulsion_F() {PORTD=PORTD|0b11110000;}//éteindra les leds/bobines
void setup() {
Serial.begin(115200);
DDRB = DDRB &0b11110000;//portB en entrée 3,2,1,0 =0 =entrée
PORTB= PORTB|0b00001111;//1 = PULLUP activées
DDRC = DDRC |0b11110000;//portC en sortie 7,6,5,4 =1 =sortie
PORTC= PORTC&0b00001111;//forçées à LOW
pinMode(BP_forcage, INPUT_PULLUP); // BP appuyé ramenera GND sur l'entrée
pinMode(impulsions_R, INPUT); // voir si c'est INPUT ou INPUT_PULLUP
pinMode(impulsions_F, INPUT); // voir si c'est INPUT ou INPUT_PULLUP
attachInterrupt(0, isr_impulsion_R, RISING); // voir si c'est le bon sens FALLING ou RISING
attachInterrupt(1, isr_impulsion_F, FALLING);// voir si c'est le bon sens FALLING ou RISING
}
void loop()
{
state = comptage_impulsion % 5; /// Serial.print("state ");Serial.print(state);
if (!digitalRead(BP_forcage)) // BP pour forcer la limitation d'allumages
{ /// Serial.print(" BP_forcage ");Serial.println(digitalRead(BP_forcage));
choix_du_mode(); ///Serial.print(" mode ");Serial.println(mode);
bridage = true;
switch (mode)
{
case 1: { //on ne supprime pas d'allumage
if (state == 1 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b11101111; /// Serial.println("led 1");
}
} break;
case 2: { //on supprime 1 allumages sur 4
if (state == 2 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b11011111; /// Serial.println("led 2");
}
} break;
case 3: { //on supprime 2 allumages sur 4
if (state == 3 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b10111111; /// Serial.println("led 3");
}
} break;
case 4: {
if (state == 4 )
{
comptage_impulsion = 0; //on supprime 3 allumages sur 4
PORTD=PORTD&0b01111111;/// Serial.println("led 4");
}
} break;
default:{}break;
}
}
else // pas d'appui sur le BP_forcage
{
/// Serial.print(" mode libre ");Serial.println(mode);
if(bridage){mode--;}bridage=false;
switch (mode)
{
//case 0: {} break;
case 1: { // on ne supprime pas d' allumage
if (state == 1 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b11101111; /// Serial.println("led 1");
}
} break;
case 2: { // on supprime 1 allumages sur 4
if (state == 2 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b11011111; /// Serial.println("led 2");
cpt_state++;if(cpt_state>10){mode--;cpt_state=0;}
}
} break;
case 3: { // on supprime 2 allumages sur 4
if (state == 3 )
{
comptage_impulsion = 0;
PORTD=PORTD&0b10111111; /// Serial.println("led 3");
cpt_state++;if(cpt_state>10){mode--;cpt_state=0;}
}
} break;
case 4: {
if (state == 4 ) // on supprime 3 allumages sur 4
{
comptage_impulsion = 0;
PORTD=PORTD&0b01111111; /// Serial.println("led 4");
cpt_state++;if(cpt_state>10){mode--;cpt_state=0;}
}
} break;
default:{}break;
}
}
}
void choix_du_mode()
{ // Serial.println( PINB&0b00000111);
if ((PINB&0b00000111) == 7)
{
val = map(analogRead(capteur_analogique), 0, 1023, 0, 30); // capteur analogique >10, >15, >20, >25
if (val > 20) {mode = 2;}
else {if (val > 15) {mode = 3;}
else {if (val > 10) {mode = 4;}
else {mode = 1;}}}
}
else
{
mode = PINB & 0b00000111;
}
}