Функция Arduino не работает, перезапуск цикла
Я пишу скетч, где код доступа вводится с клавиатуры, и правильный код доступа запускает таймер обратного отсчета внутри функции, называемой счетчиком. Но всякий раз, когда я ввожу правильный код доступа на клавиатуре, он запускает установленное мной реле и ЖК-дисплей. И в мониторе он говорит, что счетчик запускается, а затем возвращается к циклу и говорит ввести код доступа. Я не могу найти причину, по которой он не запускает всю функцию счетчика. Кто-нибудь может найти ошибку в моем коде?
#include <SPI.h>
#include "LCD_Driver.h"
#include "GUI_Paint.h"
#include "image.h"
#include <Keypad.h>
#define Password_Length 8
#define relay 2
#define red1 3
#define green1 4
long hour = 23, minute = 59, second = 59;
long countdown_time = (hour*3600) + (minute * 60) + second;
//int s=0,m=0,h=0;
char Data[Password_Length];
char Master[Password_Length] = "4444444";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;
const byte ROWS = 4;
const byte COLS = 3;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {A1, A2, 5, A4};
byte colPins[COLS] = {A5, A0, A3};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
// timer is used to keep track of current time until Unlock
PAINT_TIME timer;
void setup()
{
Config_Init();
LCD_Init();
LCD_SetBacklight(1000);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, BLACK);
Paint_Clear(BLACK);
Paint_DrawString_EN(73, 123, "WELCOME",&Font24, BLACK, GREEN);
Serial.begin(9600);
pinMode(relay, OUTPUT);
pinMode(red1, OUTPUT);
pinMode(green1, OUTPUT);
digitalWrite(red1, 0);
digitalWrite(green1, 0);
delay(1000); // 1 seconds
}
void loop()
{
Paint_Clear(BLACK);
Serial.print("\nEnter PassCODE:");
Paint_DrawString_EN(73, 100, "ENTER",&Font24, BLACK, GREEN);
Paint_DrawString_EN(73, 120, "PASSCODE",&Font24, BLACK, GREEN);
digitalWrite(relay, 0);
digitalWrite(green1,0);
digitalWrite(red1, 0);
getpwd();
}
void getpwd()
{
//Paint_Clear(BLACK);
while(data_count<7)
{
customKey = customKeypad.getKey();
if (customKey){
Data[data_count] = customKey;
Serial.print(Data[data_count]);
//Paint_DrawString_EN(123, 123+data_count, "*",&Font16, BLACK, GREEN);
data_count++;
}
}
if(data_count == Password_Length-1){
if(!strcmp(Data, Master)){
Serial.println("\nCorrect");
clearData();
digitalWrite(relay, 1);
digitalWrite(green1,1);
digitalWrite(red1, 0);
delay(5000);
counter();
}
else{
Serial.println("\nIncorrect");
Paint_Clear(BLACK);
Paint_DrawString_EN(123, 123, "Incorrect",&Font16, BLACK, GREEN);
//digitalWrite(relay, 0);
//digitalWrite(green1,0);
//digitalWrite(red1, 1);
clearData();
}
}
}
void clearData()
{
while(data_count !=0){
Data[data_count--] = 0;
digitalWrite(green1, 0);
digitalWrite(red1, 1);
digitalWrite(relay, 0);
}
return;
}
void counter() {
digitalWrite(green1, 0);
digitalWrite(red1, 0);
digitalWrite(relay, 0);
//Serial.print("\nCounter Starts");
Paint_Clear(BLACK);
long countdowntime_seconds = countdown_time - (millis() / 1000);
if (countdowntime_seconds >= 0) {
long countdown_hour = countdowntime_seconds / 3600;
long countdown_minute = ((countdowntime_seconds / 60)%60);
long countdown_sec = countdowntime_seconds % 60;
if (countdown_hour < 10) {
Paint_DrawString_EN(123, 123, &countdown_hour,&Font16, BLACK, GREEN);
}
Paint_DrawString_EN(123, 123, &countdown_hour,&Font16, BLACK, GREEN);
//Paint_DrawString_EN(123, 123, ":",&Font16, BLACK, GREEN);
Serial.print(countdown_hour);
Serial.print("\:");
if (countdown_minute < 10) {
Paint_DrawString_EN(123, 123, &countdown_minute,&Font16, BLACK, GREEN);
}
Paint_DrawString_EN(123, 123, &countdown_minute,&Font16, BLACK, GREEN);
// Paint_DrawString_EN(123, 123, ':',&Font16, BLACK, GREEN);
Serial.print(countdown_minute);
Serial.print("\:");
if (countdown_sec < 10) {
// Paint_DrawString_EN(123, 123, '0',&Font16, BLACK, GREEN);
}
Paint_DrawString_EN(123, 123, &countdown_sec,&Font16, BLACK, GREEN);
Serial.print(countdown_sec);
Serial.print("\n");
delay(500);
}
}
@Pierre, 👍0
Обсуждение1 ответ
Как следует из его названия, loop()
вызывается повторно, и поэтому после возврата counter()
возвращается также getpwd() и loop ()
. Затем система Arduino снова вызывает loop ()
.
Если вам нужно другое поведение, вам нужно будет реализовать какой-то механизм блокировки. Есть слишком много способов показать их здесь. Проведите некоторое исследование, по крайней мере, в приведенных примерах, чтобы найти тот, который вам нравится.
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- Почему на моем ЖК-дисплее 16x2 отображаются странные буквы и не удается вставить клавишу с клавиатуры?
- LCD экран печатает одни и те же символы дважды
- Оператор Switch застрял в цикле
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Черные квадраты дисплея Arduino 16x2
реле? ЭМИ? какое реле? что он переключает?, @Juraj
Вы сами написали код или скопировали и вставили его откуда-то? Функция
counter()
будет работать, но она не будет блокироваться до тех пор, пока обратный отсчет не закончится. Похоже, что он должен вызываться снова и снова в неблокирующем стиле кодирования, в то время как ваш код вloop()
написан в блокирующем стиле кодирования., @chrislКроме того, этот код никогда не сможет напечатать "Счетчик начинается", так как эта строка закомментирована., @Majenko
Да, я прокомментировал это, потому что он продолжал писать это, когда я запускал код обратного отсчета в скетче. Я написал код сам, с помощью других людей. К сожалению, у меня есть реле, подключенное к электромагнитному замку и светодиоду. Я посмотрю на стиль блокировки, спасибо, @Pierre
у вас есть логическая ошибка в
if(data_count == Password_Length-1)
... значениеdata_count
- это не то, что вы думаете .... вы должны печатать отладочную информацию по всему вашему коду ... на самом деле, этот оператор " if "даже не нужен, потому что у вас есть" while (data_count<7)` ... потратьте больше времени на размышления о поведении каждого раздела вашего кода и о том, как каждый раздел влияет на переменные, @jsotola