Detecter un front montant opto-coupleur

Bonjour, je souhaite détecter uniquement un front montant.
Je souhaite que le programme ajoute à la variable n lorsque l'optocoupleur change d'état (état HIGH). Le problème c'est que pendant toute la durée ou il est dans cet état, il ajoute donc je me retrouve avec de mauvaises valeurs.

Voici mon programme :

#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

#define WHITE 0x7

const int ledPin=13;
const int optoPin=2;
int optoState = 0;



void setup() {

 
  Serial.begin(9600);
  
  lcd.begin(16, 2);
  
  lcd.setBacklight(WHITE);
  
    pinMode(optoPin, INPUT);
  pinMode(ledPin, OUTPUT);
  
  
}

uint8_t i=0;
void loop() {
  
  optoState = digitalRead(optoPin);

  
lcd.setCursor(0, 1);

if (optoState ==HIGH) {
digitalWrite(ledPin,LOW);
lcd.print ("LOW ");
}

if (optoState ==LOW) { 
  digitalWrite(ledPin,HIGH);
lcd.print ("HIGH");
}
  }

J'ai essayé en untilant "for" a la place de "if" mais cela ne fonctionne pas non plus.

Merci de votre aide

Salut,

void loop() {

static byte flag=LOW;
  
  optoState = digitalRead(optoPin);

  
lcd.setCursor(0, 1);

if (optoState ==HIGH && flag==LOW) {
digitalWrite(ledPin,LOW);
lcd.print ("LOW ");
flag=HIGH;
}

if (optoState ==LOW && flag==HIGH) { 
flag=LOW;
  digitalWrite(ledPin,HIGH);
lcd.print ("HIGH");
}
  }

variable n

subliminale, sans doute :slight_smile:

bonjour
le plus simple = passer par l'interruption 0 (pin2) pour faire un n++ avec l'int0 attachée en rising

Merci B@tto pour ta réponse, cela me semble pouvoir fonctionner, j'essayerai ça dès que j'ai le matériel pour.

Pour la variable n j'ai tout simplement copié le mauvais code

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include "LiquidCrystal.h"
int C;int L;


Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

#define WHITE 0x7

const int ledPin=13;
const int optoPin=2;
int optoState = 0;



void setup() {

  // Debugging output
  Serial.begin(9600);
  
  C=0;L=0;lcd.setCursor(C, L);
  
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
  lcd.print("    Tirelire");
  lcd.setCursor(0, 1);
  lcd.print ("   automatise");
  
  pinMode(optoPin, INPUT);
  pinMode(ledPin, OUTPUT);
  
}

uint8_t i=0;
void loop() {

  
  lcd.setCursor(0, 1);
  
  static int n=0;

  uint8_t buttons = lcd.readButtons();
  
  optoState = digitalRead(optoPin);
    
    if (optoState ==HIGH) {
     
      digitalWrite(ledPin,LOW);
      n = n+1;

      C=0;L=0;lcd.setCursor(C, L);

      lcd.print("Argent disponible :");
      
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
      
    }
    
    if (optoState ==LOW) {
      
      digitalWrite(ledPin,HIGH);
      n = n-1;
      lcd.print("Argent disponible :");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
      
    

  }
}

Je ne comprend pas très bien Artouste, pourrais tu me réexpliquer ?

projetbeaumont:
Je ne comprend pas très bien Artouste, pourrais tu me réexpliquer ?

par exemple le code ci-dessous
ça fait n+1 à chaque front montant sur le pin2 d'un uno

unsigned long n=0; 

void setup() {

  pinMode(2, INPUT); // sans pullup
  //pinMode (2,INPUT_PULLUP); // avec pullup
  attachInterrupt(0, Addn, RISING); // utilisation interrupt 0 = pin2 sur uno/nano sur montée du signal
  }

void loop(){
   }

// Interrupt on Rising 
void Addn(){
n ++;  // inceremente n à chaque int
}