2015-08-03 2 views
0

Я использую 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); 

    } 
} 
+1

В коде есть некоторые ошибки (скорее всего). 'while (sense == HIGH) {count + 1;}' вычисляет 'count + 1', но ** не ** присваивает результат чему-либо (счетчик не увеличивается). Замените его 'count + = 1;' или 'count = count + 1;'. В конце вашего блока 'if' у вас есть' count == 0; '. Это всегда будет оцениваться как 'false' (поскольку' if'-statement равен 'count> = 1'), ** не ** присваивать что-либо' count'. Вы имели в виду 'count = 0;'? – gurka

+0

Кроме того, вы должны иметь возможность пропускать петли и использовать прерывания. «Есть только два внешних контакта прерывания на ATmega168/328 (то есть в Arduino Uno/Nano/Duemilanove), INT0 и INT1, и они сопоставляются с контактами Arduino 2 и 3. Эти прерывания могут быть настроены на срабатывание на RISING или FALLING, или на низком уровне. _ "- http://playground.arduino.cc/Code/Interrupts – gurka

ответ

1

Вы правы, вы можете заменить delay() с millis(). Общим подходом является использование шаблона кода времени, который не прерывает основной цикл. Это позволяет Arduino выполнять команды в определенных частотах или временах.

В следующем примере показано, как вы можете выполнять функцию каждую секунду (и каждую четвертую секунду) без использования delay(). Я думаю, это должно решить вашу проблему и позволяет псевдо-параллельное выполнение:

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

Кроме того, вы уже можете найти некоторые подобные вопросы, такие Arduino Multitasking на StackOverflow.

+0

Так что я должен поместить код отображения анимации под' previousMillis = millis(); '? Потому что он не работает @ user3704293 –