Я использую arduino uno, преобразователь логического уровня, светодиодную матрицу adafruit Bicolor, малину pi и кнопку, но у меня есть некоторые проблемы. Моя цель состоит в том, что когда кнопка нажимается на пи, он посылает сигнал на arduino Uno, который изменит анимацию на рюкзаке LED. Проблема в том, что кнопка должна удерживаться нажатой вправо, когда цикл перезапускается, и если вы нажмете его в любой другой момент, когда он не будет работать, я думаю, что это потому, что я использую delay(), который останавливает все. Есть ли способ сделать паузу без использования задержки()? Я слышал о том, как использовать Millis(), но я новичок в Arduino, и я не уверен, как бы это реализовать. Заранее спасибо.Пауза без задержки() arduino
#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);
}
}
В коде есть некоторые ошибки (скорее всего). 'while (sense == HIGH) {count + 1;}' вычисляет 'count + 1', но ** не ** присваивает результат чему-либо (счетчик не увеличивается). Замените его 'count + = 1;' или 'count = count + 1;'. В конце вашего блока 'if' у вас есть' count == 0; '. Это всегда будет оцениваться как 'false' (поскольку' if'-statement равен 'count> = 1'), ** не ** присваивать что-либо' count'. Вы имели в виду 'count = 0;'? – gurka
Кроме того, вы должны иметь возможность пропускать петли и использовать прерывания. «Есть только два внешних контакта прерывания на ATmega168/328 (то есть в Arduino Uno/Nano/Duemilanove), INT0 и INT1, и они сопоставляются с контактами Arduino 2 и 3. Эти прерывания могут быть настроены на срабатывание на RISING или FALLING, или на низком уровне. _ "- http://playground.arduino.cc/Code/Interrupts – gurka