Motor DC con Sensor Inductivo

Buenas tardes espero se encuentren muy bien, me encuentro haciendo un programa para controlar un motoreductor (12v 18rpm), por medio de un boton necesito que este empiece a girar, con el cambio de flanco del sensor inductivo (LJ12A3-4-Z/BY) debe empezar a contar un tiempo (esto es para una emergencia), cuando de la vuelta y se encuentre de nuevo con el sensor inductivo y tengamos otro nuevo cambio de fanco debe detenerse, el problema es que esto ultimo no lo esta haciendo, si no que para solo con el tiempo de emergencia que le puse.

#include <Arduino.h>

const int sensor = 13; //(entrada)
const int motor =  11; //(salida)
const int greenbutton = 4;
int estado_sensor, estado_sensorAnt = LOW;
unsigned long previousMillis = 0;        // almacenará la ultima actualización de LED
const unsigned long interval = 10000; 
bool flag = false;                      // flag que controla cuando usar el delay con millis()

void setup() {
  Serial.begin(9600);
  pinMode(motor, OUTPUT);//motor encendido
  pinMode(sensor, INPUT);// entrada de sensor
  pinMode(greenbutton, INPUT_PULLUP);
}

void loop() {
  unsigned long currentMillis = millis();  // cargo currentMillis con el valor de millis()

  estado_sensor = digitalRead(sensor);
  if (digitalRead(greenbutton)==LOW){
    digitalWrite(motor,HIGH);
  }
  if (!estado_sensor && estado_sensorAnt) { // si cambia de 0 a 1 entonces se activó el sensor 
                                            // esto ocurre solo 1 vez cuando cambió el sensor
      previousMillis = millis();
      flag = true;
  }   
  estado_sensorAnt = estado_sensor;
  Serial.print(estado_sensor);
  if (!estado_sensor && estado_sensorAnt) {
    digitalWrite(motor,LOW);
    flag=false;
  }
  if (flag) {                      // solo ejecuto el tiempo si el flag esta activo
      if (currentMillis - previousMillis >= interval) { // si pasaron 2500 mseg apago
          digitalWrite(motor, LOW);
          flag = false;           // reseteo flag hasta la proxima activación
      }
  }
}

Si por favor me pueden decir que estoy haciendo mal, como hago para que el motor se detenga cuando encuentre de nuevo al sensor inductivo.

Prueba esta versión modificada de tu código

#include <Arduino.h>
#include <Arduino.h>

const int sensor = 13; //(entrada)
const int motor =  11; //(salida)
const int greenbutton = 4;
int estado_sensor, estado_sensorAnt = LOW;
unsigned long previousMillis = 0;        // almacenará la ultima actualización de LED
const unsigned long INTERVAL = 10000UL; 
bool flag = false;                      // flag que controla cuando usar el delay con millis()

void setup() {
  Serial.begin(9600);
  pinMode(motor, OUTPUT);//motor encendido
  pinMode(sensor, INPUT);// entrada de sensor
  pinMode(greenbutton, INPUT_PULLUP);
}

void loop() {
  unsigned long currentMillis = millis();  // cargo currentMillis con el valor de millis()

  estado_sensor = digitalRead(sensor);
  if (digitalRead(greenbutton)==LOW){
    digitalWrite(motor,HIGH);
  }

  if (!estado_sensor && estado_sensorAnt) { // si cambia de 0 a 1 entonces se activó el sensor 
                                            // esto ocurre solo 1 vez cuando cambió el sensor
      flag = !flag;
      if (flag) 
          previousMillis = millis();
      Serial.print(flag);
  }   
  estado_sensorAnt = estado_sensor;
 
  if (!flag || currentMillis - previousMillis >= INTERVAL) ) {                      // solo ejecuto el tiempo si el flag esta activo
      digitalWrite(motor, LOW);
  }
}

Muchas gracias Surbyte he probado el codigo que me sugieres y tengo los siguientes inconvenierntes:
1-El motor arranca la primera vez siempre y cuando el metal no este al frente del sensor inductivo.
2-Una vez para y tengo que iniciarlo de nuevo para que de otra vuelta hay que dejar el boton presionado hasta que llegue otra vez al el metal al frente del sensor inductivo.

Por mi parte hice la siguiente modificación

#include <Arduino.h>

const int sensor = 13; //(entrada)
const int motor =  11; //(salida)
const int greenbutton = 4;
int estado_sensor, estado_sensorAnt = LOW;
unsigned long previousMillis = 0;     
const unsigned long interval = 15000; 
bool flag = false;                     
void setup() {
  //Serial.begin(9600);
  pinMode(motor, OUTPUT);//motor encendido
  pinMode(sensor, INPUT);// entrada de sensor
  pinMode(greenbutton, INPUT_PULLUP);
}

void loop() {
  unsigned long currentMillis = millis();  

  estado_sensor = digitalRead(sensor);
  
  if (digitalRead(greenbutton)==LOW ){
    digitalWrite(motor,HIGH);
    previousMillis = millis();
    flag = true;
  }
 estado_sensorAnt = estado_sensor;

 
    if (!estado_sensorAnt && sensor ) {
    delay (200);
    digitalWrite(motor,LOW);
    flag=false;
    return;
    }
 estado_sensorAnt = LOW;
    if (flag) {                      
      if (currentMillis - previousMillis >= interval) { 
          digitalWrite(motor, LOW);
          flag = false;           
  }
}
}

Pero sigo teniendo se siguiente problema

1-Una vez el motor da la primera vuelta y se apaga cuando el metal esta al frente del motor inductivo, para que vuelva a prender tengo que dejar el boton presionado para que salga del area donde el sensor inductivo esta al frente del metal y de nuevamente una vuelta.
Mi objetivo final es tener dos o tres botones y que uno sea de dos vueltas, otro de tres vueltas por ejemplo por medio de un for, entonces creo que lo que falta es reiniciar la bandera o el estado del sensor pero no lo he logrado.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.