Arduino液晶屏幕随机显示破碎的字符

时间:2017-10-31 18:55:27

标签: arduino

所以我一直在为逃生室拼图做一个arduino项目。它基本上是一个带有液晶屏幕上的计时器的炸弹。在解决了炸弹的所有元素之后,计时器停止并且液晶屏幕显示炸弹已被消除,并为该组提供下一个谜题的线索。 10次​​中有9次完美运行。但每隔一段时间,当它应该显示炸弹被解散时,液晶屏幕就会显示随机破碎的字符。我没有运气诊断这个问题。希望有人在这里可能会有一个想法。

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14

Tone tone1;

int Scount = 0;
int Mcount = 0;
int Hcount = 1;
int DefuseTimer = 0;

long secMillis = 0;
long interval = 1000;

char password[6] = "594432";
int currentLength = 0;
int i = 0;
char entered[6];

int ledPin = 23;
int ledPin2 = 25;
int ledPin3 = 27;
int ledPin4 = 29;
int ledPin5 = 31;
int ledPin6 = 34;

const int plugin1 = 44;
const int plugin2 = 46;
const int plugin3 = 48;
const int plugin4 = 50;
const int plugin5 = 52;

int plugin1State = 0;
int plugin2State = 0;
int plugin3State = 0;
int plugin4State = 0;
int plugin5State = 0;

const int switch1 = 37;

int switch1State = 0;

const int key1 = 40;

int key1State = 0;

int puzzle1 = 0;
int puzzle2 = 0;
int puzzle3 = 0;

int solved = 0;

LiquidCrystal lcd(7, 8, 10, 11, 12, 13);

const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3};
byte colPins[COLS] = {A4, A5, A6};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);

  pinMode(plugin1, INPUT);
  pinMode(plugin2, INPUT);
  pinMode(plugin3, INPUT);
  pinMode(plugin4, INPUT);
  pinMode(plugin5, INPUT);

  digitalWrite(plugin1, HIGH);
  digitalWrite(plugin2, HIGH);
  digitalWrite(plugin3, HIGH);
  digitalWrite(plugin4, HIGH);
  digitalWrite(plugin5, HIGH);

  pinMode(switch1, INPUT);
  digitalWrite(switch1, HIGH);

  pinMode(key1, INPUT_PULLUP);
  digitalWrite(key1, HIGH);

  tone1.begin(9);
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.clear();
  lcd.setCursor(0, 0);

  tone1.play(NOTE_E6, 200);
  delay(3000);
  lcd.clear();
  currentLength = 0;
}


void loop()
{
  timer();

  plugin1State = digitalRead(plugin1);
  plugin2State = digitalRead(plugin2);
  plugin3State = digitalRead(plugin3);
  plugin4State = digitalRead(plugin4);
  plugin5State = digitalRead(plugin5);

  if (plugin1State == LOW && plugin2State == LOW && plugin3State == LOW && plugin4State == LOW && plugin5State == LOW)
  {
    puzzle1 = 1;
  }


  if (puzzle1 == 1)
  {
    digitalWrite(ledPin4, HIGH);
    switch1State = digitalRead(switch1);
    if (switch1State == LOW)
    {
      puzzle2 = 1;
    }
  }

  if (puzzle2 == 1)
  {
    digitalWrite(ledPin5, HIGH);
    key1State = digitalRead(key1);
    if (key1State == LOW)
    {
      puzzle3 = 1;
    }
    if (key1State == HIGH)
    {
      digitalWrite(ledPin6, LOW);
    }
  }

  if (puzzle3 == 1)
  {
    digitalWrite(ledPin6, HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Code: ");

    while (currentLength < 6)
    {
      timer();

      char key2 = keypad.getKey();
      if (key2 == "#")
      {
        currentLength = 0;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Code: ");
      }
      else if (key2 != NO_KEY)
      {
        lcd.setCursor(currentLength + 7, 0);
        lcd.cursor();

        lcd.print(key2);
        entered[currentLength] = key2;
        currentLength++;
        tone1.play(NOTE_C6, 200);
        delay(100);
        lcd.noCursor();
        lcd.setCursor(currentLength + 6, 0);
        lcd.print("*");
        lcd.setCursor(currentLength + 7, 0);
        lcd.cursor();
      }
    }
    if (currentLength == 6)
    {
      if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3] && entered[4] == password[4] && entered[5] == password[5])
      {
        solved = 1;

        while (solved == 1)
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("BOMB 1 DEFUSED");
          currentLength = 0;
          digitalWrite(ledPin3, HIGH);
          delay(1500);

          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("RELEASE");
          delay(1500);

          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("TOXIC GAS");
          delay(1500);

          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("CLUE: %&@$#");
          delay(6000);
        }
      }
      else
      {
        lcd.noCursor();
        lcd.clear();
        lcd.home();
        lcd.print("Wrong Password!");

        delay(1500);
        currentLength = 0;
      }
    }
  }
}

void timer()
{

  if (Hcount <= 0)
  {
    if ( Mcount < 0 )
    {
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.print("The Bomb Has ");
      lcd.setCursor (0, 1);
      lcd.print("Exploded!");

      while (Mcount < 0)
      {
        digitalWrite(ledPin, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100);
        digitalWrite(ledPin, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100);
        digitalWrite(ledPin2, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100);
        digitalWrite(ledPin2, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100);
        digitalWrite(ledPin3, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100);
        digitalWrite(ledPin3, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100);
      }
    }
  }

  lcd.setCursor (0, 1); // sets cursor to 2nd line
  lcd.print ("Timer:");

  if (Hcount >= 10)
  {
    lcd.setCursor (7, 1);
    lcd.print (Hcount);
  }
  if (Hcount < 10)
  {
    lcd.setCursor (7, 1);
    lcd.write ("0");
    lcd.setCursor (8, 1);
    lcd.print (Hcount);
  }

  lcd.print (":");

  if (Mcount >= 10)
  {
    lcd.setCursor (10, 1);
    lcd.print (Mcount);
  }
  if (Mcount < 10)
  {
    lcd.setCursor (10, 1);
    lcd.write ("0");
    lcd.setCursor (11, 1);
    lcd.print (Mcount);
  }

  lcd.print (":");

  if (Scount >= 10)
  {
    lcd.setCursor (13, 1);
    lcd.print (Scount);
  }
  if (Scount < 10)
  {
    lcd.setCursor (13, 1);
    lcd.write ("0");
    lcd.setCursor (14, 1);
    lcd.print (Scount);
  }

  if (Hcount < 0)
  {
    Hcount = 0;
  }

  if (Mcount < 0)
  {
    Hcount --;
    Mcount = 59;
  }

  if (Scount < 1) // if 60 do this operation
  {
    Mcount --; // add 1 to Mcount
    Scount = 59; // reset Scount
  }

  if (Scount > 0) // do this oper. 59 times
  {
    unsigned long currentMillis = millis();

    if (currentMillis - secMillis > interval)
    {
      tone1.play(NOTE_G5, 200);
      secMillis = currentMillis;
      Scount --; // add 1 to Scount
      digitalWrite(ledPin2, HIGH); // sets the LED on
      delay(10); // waits for a second
      digitalWrite(ledPin2, LOW); // sets the LED off
      delay(10); // waits for a second
      //lcd.clear();
    }
  }
}

2 个答案:

答案 0 :(得分:0)

这很可能与您的LCD电路有关。像你这样的简单代码(不试图以任何方式侮辱你)的事实可以实现9/10次,这意味着代码可能没有任何问题(我没见过)。

要快速检查,请尝试重新安装IDE。这可能会更新使用IDE下载的Arduino库。我怀疑它会解决这个问题,但这是一个快速免费的简单方法来尝试

我会个人建议断开一切,并重新连接它们。如果它不起作用,那么返回那个液晶显示器,让自己换一个新的。

答案 1 :(得分:0)

当我使用非屏蔽的1米带状电缆连接16x2 LCD时,我遇到了同样的问题。带有MCU的主板必须远离显示器放置。它显示出任何电磁干扰的随机特性。例如,打开荧光灯管,启动电动螺丝刀,继电器开关等。缩短ribon电缆解决了这个问题。 无论如何,LCD对电磁干扰很敏感。远离这些来源。