Me presento , me llamo Camilo, soy nuevo en esto de Arduino y es espectacular.
Quiero, porfavor, ayuda con un problema de logica.
Se programar en otros lenguajes, pero esto del loop y aprendiendo el entorno de las variables no puedo realizar una tarea...
Estoy enviando un post con el estado de un puerto a una rest full en php, el problema es que si la entrada esta en LOW lo envia , pero lo envia segun el delay() que coloque, y solo quiero que lo envie una vez , a menos que pase el estado a HIGH, no quiero que este enviando peticiones en cada momento, solo cuando cambia el estado..
No puedo hacer la logica en el IDE de arduino, existe alguna funcion que permita hacerlo o alguien con mayor experiencia sabe como? gracias.
En el setup() lees el estado del puerto y lo guardas en una variable, digamos estado_anterior o bien, directamente le asignas a esta variable el estado que sabes que tendrá el puerto al momento del arranque (yo prefiero lo primero).
Luego en el loop(), lees el estado del puerto y lo guardas en otra variable, digamos estado_actual
Comparas estado_actual con estado_anterior y si son distintas entonces hay cambio de estado. Guardas estado_actual en estado_anterior para la próxima comparación (al reiniciar loop()) y envias el post y lo que haga falta.
Si son iguales, obviamente no hay cambio de estado y no haces nada.
Si además quisieras que solo actúe con determinado flanco, luego de la primer comparación, te fijas si estado_actual es LOW para detectar el flanco descendente o HIGH para el ascendente.
Una aclaración de algo que te puede llegar a resultar confuso viniendo de otros lenguajes.
LOW = false = 0
HIGH = true = 1
En el caso especial de true, cualquier valor no 0 se considera true y, por supuesto, 1 lo es.
no se que pasa, si la placa se marea o no, es un Esp8266.. pero el codigo que me funciono ahora me repite cuando el valor es LOW de buttonState, no puedo encontrar el error..
const int buttonPin = 5; // declara el pin donde esta conectado el pulsador
const int ledPin = 13; // declara el pin donde esta conectado el LED
int buttonPushCounter = 0; // contador para el número de pulsaciones de botón
int buttonState = 0; // actual estado del pulsador
int lastButtonState = 0; // estado previo del pulsador
void setup() {
// inicializa el pulsador como entrada:
pinMode(buttonPin, INPUT_PULLUP);
// inicializa el LED como una salida:
pinMode(ledPin, OUTPUT);
// inicializa la comunicación serie:
Serial.begin(115200);
}
void loop() {
// lee el estado del pin del pulsador:
buttonState = digitalRead(buttonPin);
// compara el estado del pulsador con su anterior estado
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
Serial.println("on");
}
else {
Serial.println("off");
}
}
lastButtonState = buttonState;
}`Texto preformateado`no se que pasa, si la placa se marea o no, es un Esp8266.. pero el codigo que me funciono ahora me repite cuando el valor es LOW de buttonState, no puedo encontrar el error..
const int buttonPin = 5; // declara el pin donde esta conectado el pulsador
const int ledPin = 13; // declara el pin donde esta conectado el LED
int buttonPushCounter = 0; // contador para el número de pulsaciones de botón
int buttonState = 0; // actual estado del pulsador
int lastButtonState = 0; // estado previo del pulsador
void setup() {
// inicializa el pulsador como entrada:
pinMode(buttonPin, INPUT_PULLUP);
// inicializa el LED como una salida:
pinMode(ledPin, OUTPUT);
// inicializa la comunicación serie:
Serial.begin(115200);
}
void loop() {
// lee el estado del pin del pulsador:
buttonState = digitalRead(buttonPin);
// compara el estado del pulsador con su anterior estado
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
Serial.println("on");
}
else {
Serial.println("off");
}
}
lastButtonState = buttonState;
}
Anoche lo simulé en wokwi.com y Proteus y funcionó sin problemas poniendo el delay a modo de antirrebote.
En todo caso lee en la sección Documentación el tutorial "Cómo no leer un boton..." para ver lo del antirrebote.
Moderador:
No sigas respondiendo sin prestar atención a esto!!
Lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>
Excelente que hayas conseguido la solucion a tu problema.
Aprovecho para mencionarte que dentro de sus parametros normales de operacion TODOS los interruptores son "ruidosos", independientemente de la corriente o tension que estan conmutando.
Te dejo un circuito simple y facil de implementar que puedes incorporar a cualquier entrada de microcontrolador para filtrar (o mas bien eliminar) el efecto de rebote que se produce al accionar un interruptor cualquiera.
Tambien existen otras tecnicas via software, que pueden incluir activar funcionalidades DEBOUNCE en el puerto de entrada del uC si estas estan disponibles.