Stack Overflow en español Asked by Agustin on December 14, 2021
estuve trabajando con dos sensores GP2Y0A21 activando y desactivando focos, ahora quiero hacer lo mismo pero ingresando un delay cada que se active uno o el otro y si se activan los dos que no generen problemas, al momento de ingresar delays en mi codigo este solo me respeta una vez y de ahi entra en un bucle espero me ayuden
Anexo mi codigo;
**void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
if (analogRead(0) < 150) {
digitalWrite(8, HIGH);
delay(1000);
}
else{
digitalWrite(8, LOW);
delay(10000);
}
if(analogRead(1) < 150){
digitalWrite(7, HIGH);
delay(1000);
}
else{
digitalWrite(7, LOW);
delay(10000);
}
}**
Tu pregunta me resultó un tanto confusa, pero después de darle muchas vueltas creo entender.
Lo que sucede es que no entiendes lo que en verdad hace la función delay()
. Esta función paraliza todo tu código, es decir, que nada puede ejecutarse mientras se esté contando el tiempo de la pausa. Tu llamas a la función delay todo el tiempo, cada vez que el loop se repite, dejando un dejando solo un pequeñisimo espacio de tiempo para que se la luz se encienda.
void loop(){
//se ejecuta primero esto
delay(1000);
//Pasado el tiempo se ejecuta esto
delay(1000)
//Se repite el loop
}
El uso de delay es muy práctico para la enseñanza como el blink, también para hacer test o para añadir cierta protección a la placa, pero se desaconseja su uso en aplicaciones más complicadas o profesionales. En su lugar, usa millis()
.
La función millis()
devuelve el número de milisegundos que ha transcurrido desde que se inició la placa de Arduino, tiene un máximo de 50 días, después de eso se va a reiniciar.
Se usa de la siguiente forma
const int periodo = 1000; //Tiempo a esperar
unsigned long tiempoAnterior = 0; //Variable para calcular la diferencia, siempre debe iniciar en 0
void setup() {
Serial.begin(9600);
}
void loop() {
while(millis() - tiempoAnterior >= periodo){
tiempoAnterior = millis() //para reiniciar el timer
Serial.println("Hola");
// espere [periodo] milisegundos
}
//Otro código se ejecuta al mismo tiempo
}
Este código lo que es hace es calcular la diferencia entre el tiempo desde el inicio hasta superar el periodo establecido. Por eso la variable tiempoAnterior
se le asigna el valor de millis, para reiniciar el timer, si no se reinicia, el código siempre se va a ejecutar porque millis ya superó el periodo.
Traté de mejorar tu código, pero no estoy seguro si es lo que tu esperabas:
const int periodo1 = 1000;
const int posperiodo1 = 10000;
unsigned long tiempoAnterior1 = 0;
const int periodo2 = 1000;
const int posperiodo2 = 10000;
unsigned long tiempoAnterior2 = 0;
bool activo1 = false;
bool activo2 = false;
bool posactivado1 = false;
bool posactivado2 = false;
void setup() {
//Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
if(!posactivado1){
if (analogRead(0) < 150) {
activo1 = true;
digitalWrite(8, HIGH);
}
if (activo1){
if(millis() - tiempoAnterior1 >= periodo1){
activo1 = false;
posactivado1 = true;
digitalWrite(8, LOW);
tiempoAnterior1 = millis();
}
}
else{
tiempoAnterior1 = millis();
}
}
else{
if(millis() - tiempoAnterior1 >= periodo1){
posactivado1 = false;
tiempoAnterior1 = millis();
}
}
if(!posactivado2){
if (analogRead(0) < 150) {
activo2 = true;
digitalWrite(7, HIGH);
}
if (activo1){
if(millis() - tiempoAnterior2 >= posperiodo2){
activo1 = false;
posactivado1 = true;
digitalWrite(7, LOW);
tiempoAnterior2 = millis();
}
}
else{
tiempoAnterior2 = millis();
}
}
else{
if(millis() - tiempoAnterior1 >= posperiodo2){
posactivado2 = false;
tiempoAnterior2 = millis();
}
}
}
Answered by DrakoPD on December 14, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP