Здравствуйте Гуру и мастера, помогите плиз иди дайте направление Собираю проект, на фото часть кода 1. При запуске на экране поочередно горят две картинки if(key==0) { blinktwice(); 2. Если нажать на любую клавишу матричной клавиатуры, то картинки должны исчезнуть (экран очиститься), скажем секунд на 10 и появляться набираемые цифры. Изучаю команду millis(), но что-то не получается
так и не разобрался с ошибкой. вот библиотеки которые использу #include <Keypad.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> При старте картинки горят, при нажатии на кеу, цифры видно но, картинки не сбрасываются void blinktwice() { // моргание экраном display.clearDisplay(); display.drawBitmap(0, 0, smileBmp, 84, 44, BLACK); display.display(); delay(1000); display.clearDisplay(); display.drawBitmap(5, 0, smileBmp1, 75, 48, BLACK); display.display(); delay(1000); } void loop(){ char key = keypad.getKey(); if(key==k) { if(k==0) blinktwice(); // приглашение ввести код } else { display.clearDisplay(); display.display(); k=0; } if (key){ Serial.println(key); display.clearDisplay(); display.println(key); display.display();
хотите помощи - правильно вставьте полный отформатированный код и опишите что вы от него собираетесь получить. а так вряд ли вам кто что нибудь подскажет.
Код (C++): #include <Keypad.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> Adafruit_PCD8544 display = Adafruit_PCD8544(18, 17, 16, 15, 14); const unsigned char PROGMEM smileBmp[] = { // картинка1 }; const unsigned char PROGMEM smileBmp1[] = { // картинка2 }; const unsigned char PROGMEM smileBmp2[] = { // картинка3 }; const byte ROWS = 4; //four rows const byte COLS = 4; //three columns char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad byte colPins[COLS] = {13,12,11,10}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); String summ; String keystr; int shet=0; byte k = 0; void setup(){ display.begin(); // дисплей display.clearDisplay(); display.display(); display.setContrast(50); // установка контраста display.setTextSize(2); // установка размера шрифта display.setTextColor(BLACK); // установка цвета текста display.clearDisplay(); delay(1000); Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); //---------start tone------------ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); //-------stop tone------------ } void blinktwice() { // моргание экраном display.clearDisplay(); display.drawBitmap(0, 0, smileBmp, 84, 44, BLACK); display.display(); delay(1000); display.clearDisplay(); display.drawBitmap(5, 0, smileBmp1, 75, 48, BLACK); display.display(); delay(1000); } void loop(){ char key = keypad.getKey(); if(key==k) { if(k==0) blinktwice(); // приглашение ввести код } else { display.clearDisplay(); display.display(); k=0; } if (key){ Serial.println(key); display.clearDisplay(); display.println(key); display.display(); //---------start tone------------ digitalWrite(2, HIGH); tone(10, 1440, 200); delay(200); noTone(10); digitalWrite(2, LOW); //-------stop tone------------ shet=shet+1; if (shet==6){ summ=""; keystr=""; shet=0; Serial.println("LONG"); display.clearDisplay(); display.println("LONG"); display.display(); delay(3000); display.clearDisplay(); display.display(); //---------start tone------------ digitalWrite(3, HIGH); tone(10, 600, 200); delay(200); noTone(10); digitalWrite(3, LOW); //-------stop tone------------ }; summ=summ+key; Serial.println(summ); display.clearDisplay(); display.println(summ); display.display(); keystr=String(key); if (keystr=="#"){ summ=""; keystr=""; shet=0; Serial.println("RESET"); display.clearDisplay(); display.println("RESET"); display.display(); delay(3000); display.clearDisplay(); display.display(); //---------start tone------------ digitalWrite(3, HIGH); tone(10, 600, 200); delay(200); noTone(10); digitalWrite(3, LOW); //-------stop tone------------ }; if (keystr=="*"){ summ=""; keystr=""; shet=0; Serial.println("ENTER"); display.clearDisplay(); display.println("ENTER"); display.display(); delay(3000); display.clearDisplay(); display.display(); //---------start tone------------ digitalWrite(3, HIGH); tone(10, 600, 200); delay(200); noTone(10); digitalWrite(3, LOW); //-------stop tone------------ }; if (summ=="83B12"){ Serial.println("PASS OK"); display.clearDisplay(); display.println("PASS OK"); display.display(); delay(500); display.clearDisplay(); display.drawBitmap(0, 0, smileBmp2, 84, 48, BLACK); display.display(); delay(1000); summ=""; keystr=""; shet=0; //---------start tone------------ digitalWrite(4, HIGH); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); tone(10, 300, 200); delay(200); noTone(10); tone(10, 800, 200); delay(200); noTone(10); digitalWrite(4, LOW); //-------stop tone------------ }; } }
Если я правильно понял, Вы хотите мигать картинками, пока не будет нажата какая-то клавиша. После чего на экран выводится значения с клавиатуры. Через 10 сек после последнего нажатия клавиш, опять начать мигать картинками? Такой вариант (схематически): Код (C++): unsigned long last_key_press = 0; void loop(){ char key = keypad.getKey(); if(!key){ if (millis() - last_key_press >= 10000){ blinktwice(); } } else { last_key_press = millis(); // далее обработка нажатий клавиатуры ... } }
Вот спасибо именно это и хотел, опробавал все работает, есть небольшая сложность с попаданием ввода первой цифры во время работы (blinktwice), но на экране если не попал все отображается и повторное нажатие отключает картинки. Спасибо!!!
Попробуйте такой вариант blinktwice() Код (C++): void blinktwice() { static unsigned long last_blink = 0; static bool is_first_bmp = true; if (millis() - last_blink >= 1000) { display.clearDisplay(); if (is_first_bmp) { display.drawBitmap(0, 0, smileBmp, 84, 44, BLACK); } else { display.drawBitmap(5, 0, smileBmp1, 75, 48, BLACK); } display.display(); last_blink = millis(); is_first_bmp = !is_first_bmp; } }