Pregunta logica

Hola a todos,

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.

Simple y sencillo. :wink:

Saludos

gracias, ya entendí como mantienen los valores las variables en Arduino.

Me alegro que te haya servido.

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.

Saludos

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;
}

El código va entre etiquetas </>.
Fijate como se presenta el mío.

La sentencia

lastButtonState = buttonState;

ponla dentro del primer if() así lastButtonState solo cambia si hay un cambio de estado (aunque el resultado es el mismo, yo prefiero de este modo).

A modo de prueba agrega un delay de 50 mseg luego de

buttonState = digitalRead(buttonPin);

por si el pulsador es muy "ruidoso" y genera muchos rebotes

Gracias, ingresare tus cambios y vere

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.

Saludos

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 </>


Hecho!!

Eso era solo un delay.... el pusador era el ruidoso ....ahora fucnioan de maravillas.

Hola cajofermo,

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.

debounce_circuit

Tambien existen otras tecnicas via software, que pueden incluir activar funcionalidades DEBOUNCE en el puerto de entrada del uC si estas estan disponibles.

Saludos,
MS

Muchas gracias, lo implementare de ser necesario, saludos.

Mira la librería Bounce2.h que esta en tu administrador de librerías y usa algun ejemplo. Te proporcionará debounce x software.

1 Like

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