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.
#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.