Я не могу полностью понять, почему программа не работает - проблемы с ЖК-экраном и многое другое - PullRequest
0 голосов
/ 30 марта 2019

Я работаю над проектом для автоматического дозатора Malteser (или аналогичного продукта), и я получил код для работы, но после того, как он оставлен на некоторое время, экран воспроизводится, и он не будет работать должным образом. Индикатор также всегда включен и может показаться, что он горит после установки

Я пробовал:

  • поиск кода неисправностей
  • проверка проводки
  • переделка проводки на случай, если я что-то пропустил

Код:

#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>

DS3231 Clock;
bool Century = false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
int second, minute, hour, date, month, year, temp;
int button = 8;
int maltesersEaten = 0;
int lastEatenSe = 0;
int lastEatenMi = 0;
int lastEatenHo = 0;
int lastEatenDa = 0;
int lastEatenMo = 0;
int lastEatenYe = 0;
bool eat;
int ledPin = 10;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myServo;

byte degree[8] = {
  B00100,
  B01010,
  B00100,
  B00000,
  B00000,
  B00000,
  B00000,
};

void setup() {
  **lcd.createChar(0, degree);
  lcd.begin(16, 2);  
  // Print a message to the LCD
  lcd.print("INITIALIZING");
  // Start the I2C interface
  Wire.begin();
  // Start the serial interface
  Serial.begin(9600);
  pinMode(button, INPUT);
  myServo.attach(9);**
  myServo.write(10);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(1000);
  lcd.clear();
}

void getData() {
  second = Clock.getSecond();
  minute = Clock.getMinute();
  hour = Clock.getHour(h12, PM);
  date = Clock.getDate();
  month = Clock.getMonth(Century), DEC;
  year = Clock.getYear();
  temp = Clock.getTemperature();

  lcd.setCursor(0, 0);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  lcd.print(":");
  lcd.print(second);
  lcd.setCursor(0, 1);
  lcd.print(date);
  lcd.print(",");
  lcd.print(month);
  lcd.print(",");
  lcd.print(year);
  lcd.setCursor(9, 0);
  lcd.print(temp);
  lcd.write(byte(0));
  lcd.print("C");
  lcd.setCursor(9,1);
  lcd.print("ATE:");
  lcd.print(maltesersEaten);
}

void mE() {
  maltesersEaten = (maltesersEaten + 1);
  lastEatenSe = second;
  lastEatenMi = minute;
  lastEatenHo = hour;
  lastEatenDa = date;
  lastEatenMo = month;
  lastEatenYe = year;
}



void check() {
  lcd.clear();
  lcd.print("-Last Malteser-");
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  lcd.print(":");
  lcd.print(second);
  lcd.setCursor(0, 1);
  lcd.print("Eaten: ");
  lcd.print(maltesersEaten);
  delay(5000);
  lcd.clear();
}

void loop() {
  if (digitalRead(button) == LOW) {
    digitalWrite(ledPin, HIGH);
    myServo.write(170);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("---- Have A ----");
    lcd.setCursor(0, 1);
    lcd.print("    Malteser    ");
    delay(5000);
    myServo.write(10);
    lcd.clear();
    check();
    mE();
    digitalWrite(ledPin, LOW);
  }

  else if (digitalRead(button) == HIGH) {
    getData();
  }
}

Желаемый эффект: экран выводит сообщение, светодиод мигает, затем показывает время, дату и температуру в комнате, а также количество мальтезеров, которые были съедены. затем, когда кнопка нажата, сервопривод перемещается, светодиод включается, и ЖК-дисплей переключается через несколько разных экранов, затем он возвращается к времени, дате, температуре и количеству съеденных мальтезеров. Однако фактический результат заключается в том, что светодиод постоянно включается, на ЖК-дисплее появляются два сплошных блока и больше ничего, а сервопривод становится слабым, когда я нажимаю кнопку, ничего не меняется. Я думаю, что проблема в настройке, если это не поможет.

1 Ответ

0 голосов
/ 30 марта 2019

В программе вы вызываете функцию: check (). Задержка составляет пять секунд, а в контуре задержка составляет 5 секунд. Может быть, вы всегда нажимаете кнопку, когда задержка включена. Тогда программа не заметит, что кнопка нажата, и снова продолжит цикл. Это также объясняет, почему светодиод не выключается, потому что он снова включается. Чтобы проверить, так ли это, просто нажмите и удерживайте кнопку не менее 10 секунд, и нажмите кнопку «море», если она работает. Если это так, чтобы решить эту проблему, попробуйте работать с прерыванием. Смотри документацию здесь: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...