Функция Arduino не работает, перезапуск цикла

lcd keypad

Я пишу скетч, где код доступа вводится с клавиатуры, и правильный код доступа запускает таймер обратного отсчета внутри функции, называемой счетчиком. Но всякий раз, когда я ввожу правильный код доступа на клавиатуре, он запускает установленное мной реле и ЖК-дисплей. И в мониторе он говорит, что счетчик запускается, а затем возвращается к циклу и говорит ввести код доступа. Я не могу найти причину, по которой он не запускает всю функцию счетчика. Кто-нибудь может найти ошибку в моем коде?

#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);
}

}

, 👍0

Обсуждение

реле? ЭМИ? какое реле? что он переключает?, @Juraj

Вы сами написали код или скопировали и вставили его откуда-то? Функция counter() будет работать, но она не будет блокироваться до тех пор, пока обратный отсчет не закончится. Похоже, что он должен вызываться снова и снова в неблокирующем стиле кодирования, в то время как ваш код в loop() написан в блокирующем стиле кодирования., @chrisl

Кроме того, этот код никогда не сможет напечатать "Счетчик начинается", так как эта строка закомментирована., @Majenko

Да, я прокомментировал это, потому что он продолжал писать это, когда я запускал код обратного отсчета в скетче. Я написал код сам, с помощью других людей. К сожалению, у меня есть реле, подключенное к электромагнитному замку и светодиоду. Я посмотрю на стиль блокировки, спасибо, @Pierre

у вас есть логическая ошибка в if(data_count == Password_Length-1) ... значение data_count - это не то, что вы думаете .... вы должны печатать отладочную информацию по всему вашему коду ... на самом деле, этот оператор " if "даже не нужен, потому что у вас есть" while (data_count<7)` ... потратьте больше времени на размышления о поведении каждого раздела вашего кода и о том, как каждый раздел влияет на переменные, @jsotola


1 ответ


0

Как следует из его названия, loop() вызывается повторно, и поэтому после возврата counter() возвращается также getpwd() и loop (). Затем система Arduino снова вызывает loop ().

Если вам нужно другое поведение, вам нужно будет реализовать какой-то механизм блокировки. Есть слишком много способов показать их здесь. Проведите некоторое исследование, по крайней мере, в приведенных примерах, чтобы найти тот, который вам нравится.

,