hub genuino arduino delay arduino-uno

genuino - Pausa sin demora() arduino



arduino project hub (1)

Estoy usando un arduino uno, convertidor de nivel lógico, adafruit Bicolor LED Matrix, un Raspberry pi y un botón, pero estoy teniendo algunos problemas. Mi objetivo es que cuando se presiona el botón en el pi envíe una señal al Arduino Uno que cambiará la animación en la mochila LED. El problema es que el botón debe mantenerse presionada hacia la derecha cuando se reinicia el bucle y si haces clic en él en cualquier otro momento, no funcionará, creo que esto se debe a que estoy usando la función de demora () que pausa todo. ¿Hay alguna forma de pausar sin usar delay ()? He oído hablar de usar Millis () pero soy nuevo en Arduino''s y no estoy seguro de cómo lo implementaría en absoluto. Gracias por adelantado.

#include <Adafruit_LEDBackpack.h> #include <Adafruit_GFX.h> #include <Wire.h> #include "blinky.h" // Animation for blinking and just chilling #include "looking.h" // This one looks forward when it hears or speaks Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); // We are using a bicolor Matrix int piPin = 3; char count = 0; void setup() { matrix.begin(0x70); // Turns on Matrix Serial.begin(9600); pinMode(piPin, INPUT); // Tells the pin that it''s an input } void loop() { int sense = digitalRead(piPin); //Reads the Pi pin while(sense == HIGH){ count + 1;} if(count >= 1) { //If the Raspberry Pi is sending input matrix.clear(); matrix.drawBitmap(0, 0, looking_1, 8, 8, LED_YELLOW); // It will look forward matrix.writeDisplay(); delay(3000); matrix.clear(); matrix.drawBitmap(0, 0, looking_2, 8, 8, LED_YELLOW); // It will look forward matrix.writeDisplay(); delay(200); matrix.clear(); matrix.drawBitmap(0, 0, looking_3, 8, 8, LED_YELLOW); // It will look forward matrix.writeDisplay(); delay(3000); matrix.clear(); matrix.drawBitmap(0, 0, looking_2, 8, 8, LED_YELLOW); //Makes it look back matrix.writeDisplay(); delay(2000); count == 0; } else { matrix.clear(); matrix.drawBitmap(0, 0, blink_1, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(3000); matrix.clear(); matrix.drawBitmap(0, 0, blink_2, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_3, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_4, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_5, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_6, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_7, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_8, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_9, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_8, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_7, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_6, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_5, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_4, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_3, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); matrix.clear(); matrix.drawBitmap(0, 0, blink_2, 8, 8, LED_GREEN); // It will just blink matrix.writeDisplay(); delay(100); } }


Tienes razón, puedes reemplazar delay() con millis() . Un enfoque común para eso es usar un patrón de código de comparación de tiempo, que no interrumpa el ciclo principal. Esto le permite al Arduino ejecutar comandos en frecuencias o tiempos específicos.

El siguiente ejemplo ejemplifica cómo se puede ejecutar una función cada segundo segundo (y cada cuarto de segundo) sin usar delay() . Creo que esto debería resolver su problema y permite una ejecución pseudo-paralela:

// 2 sec. frequency unsigned long interval=2000; // the time we need to wait unsigned long previousMillis=0; // millis() returns an unsigned long. // 4 sec. frequency unsigned long interval1=4000; // the time we need to wait unsigned long previousMillis1=0; // millis() returns an unsigned long. void setup() { //... } void loop() { // other CMD''s... if ((unsigned long)(millis() - previousMillis) >= interval) { previousMillis = millis(); // every second second // ... } // other CMD''s... if ((unsigned long)(millis() - previousMillis1) >= interval1) { previousMillis1 = millis(); // every fourth second // ... } // other CMD''s... }

Además, ya puedes encontrar algunas preguntas similares, como Arduino Multitasking en .