Проблемы с выводом информации на лсд

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем yhl, 27 окт 2015.

  1. yhl

    yhl Нерд

    Я уже давно сделал таймер. Он работал отлично, но день назад что то произошло с секундами. нажимаю на копку иногда как и положенно добавляются секунды, а иногда добавляться куча цифр. Почему это происходить и как это исправить ?
    Код (C++):
    // Подключаем библиотеку
    #include <LiquidCrystal.h>

    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>

    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>

    // номер на который будем отправлять сообщение
    #define PHONE_NUMBER  "+79215243517"
    // текст сообщения, которое будем отправлять
    #define MESSAGE_OK "Automatic watering system was successful."
    #define MESSAGE_ERROR "Low water."

    // создаём объект класса GPRS и передаём ему скорость 9600 бод
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs(9600);// библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
    //переменная для хранения значений таймера
    long prevmicros = 0;
    // счетчик для полусекунд
    boolean counter = false;
    //значение секунд
    int s = 0;
    //значение минут
    int m = 0;
    //значение часов
    int h = 0;
    //время настройки помпы
    //значение секунд
    int ss = 5;
    //значение минут
    int ms = 0;
    //значение часов
    int hs = 12;//значение секунд
    // переменная ошибка
    int error = 0;
    //Вывод кнопки настройки текущего времени
    const int butSetTime = 10;
    //Вывод кнопки настройки текущего времени
    const int butSetTimePump = 13;
    //статус кнопки
    int butState = 0;
    int buttonState = 0;
    //пин помпы
    int pump = 8;
    //подсветка lcd
    int light = 9;
    //датчк освещенности на А5
    const int ldr = 5;
    //значение для хранения освещенности
    int val = 0;
    //количество включений помпы расчитанные по формуле
    int pump_result;
    //екость в мл
    float ml = 100;
    //время работы помпы в мс
    float tmc = 5000;
    //количество включений помпы
    int pump_on;
    //аналоговый датчик температуры
    // конечное значеие вольт
    float voltage;
    // конечное зачение тмпературы
    float temp_c;

    void setup()
    {
      //инициализируем дисплей
      lcd.begin(16, 2);
      //
      pinMode(butSetTime, INPUT);
      pinMode(pump, OUTPUT);
      pinMode(light, OUTPUT);
      //ставим курсор в первую строку первого символа
      lcd.setCursor(3, 0);
      //включаем подсветку дисплея
      digitalWrite(9, HIGH);
      //выводим сообщение
      lcd.print("Autopoliv");
    lcd.setCursor(3, 1);
    lcd.print("Download");
      // включаем GPRS-шилд
      gprs.powerUpDown();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      while (!Serial) {
        // ждём пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS-устройства
        delay(1000);
        Serial.print("Init error\r\n");
        lcd.setCursor(0, 0);
        lcd.print("Init error       ");
      }
      //чистси дисплей
      lcd.clear();
      //расчитываем количество включений помпы
      pump_result = (ml / tmc) * 1000;
    }

    void lcd_light()
    {
      //присваиваем val значени счиьанное с анаалогва потра
      val = analogRead(5);
      //если значение считанное  с А5 < 1000
      if (analogRead(ldr) < 1000)
        //вклюаем подсвтку
        analogWrite(9, 1023);
      else
        //иначе выключаем//иначе выключаем
        analogWrite(9, 50);
    }
    void temp()
    {
      // находим конечное знчение вольт
      voltage = 5.0 / 1024.0 * analogRead(2);
      //находим конечное значнение температуры
      temp_c = ( voltage - 0.5 ) * 100;
      lcd.setCursor(10, 1);
      //выводим температуру
      lcd.print(temp_c, 1);
      lcd.setCursor(14, 1);
      //значек градуса
      lcd.print("\x99");
      lcd.setCursor(15, 1);
      //выводим C
      lcd.print("C");
    }

    void loop()
    {
      //считываем значени с кнопки
      buttonState = digitalRead(butSetTime);
      //если конопка нажата
      if (buttonState == LOW) {
        //добавляем 1 число к продыдущему
        s++;
      }

     
      if (micros() - prevmicros > 500000)
        //принимает значение каждые полсекунды
      {
        prevmicros = micros();
        counter = ! counter;
        if (counter == false)
          //переменная секунда + 1
          m++;
         
          //если переменная секунда больше 59 ...
          if (s > 59)
          {
            //сбрасываем ее на 0
            s = 0;
            //пишем +1 в переменную минута
            m++;
          }
          //если переменная минута больше 59 ...
          if (m > 59)
          {
            //сбрасываем ее на 0
            m = 0;
            //пишем +1 в переменную час
            h++;
          }
          //если переменная час больше 12 ...
          if (h > 12)
          {
            //сбрасываем ее на 0
            h = 1;
          }
          //

          //считываем значени с кнопки
      butState = digitalRead(butSetTimePump);
      //если конопка нажата
      if (butState == LOW) {
        //добавляем 1 число к продыдущему
      ms++;
          //если переменная минута больше 59 ...
          if (ms > 59)
          {
            //сбрасываем ее на 0
            ms = 0;
            //пишем +1 в переменную час
            h++;
          }
          //если переменная час больше 12 ...
          if (hs > 12)
          {
            //сбрасываем ее на 0
            hs = 1;
          }
      }
          //выводим значение часов
          lcd.setCursor(0, 0);
          //добавляем 0
          if (h >= 0 && h < 10) {
            lcd.print("0");
            lcd.print(h);
          }//количество часов
          else {
            lcd.print(h);
          }
          lcd.setCursor(2, 0);
          //выводим символ ":"между часами и минутами
          lcd.print(":");
          //выводим значение минут
          lcd.setCursor(3, 0);
          //добавляем 0
          if (m >= 0 && m < 10) {
            lcd.print("0");
            lcd.print(m);
          }//количество минут
          else {
            lcd.print(m);
          }

          lcd.setCursor(5, 0);
          //выводим символ ":"между часами и минутами
          lcd.print(":");
          //выводим значение минут
          lcd.setCursor(6, 0);
          //добавляем 0
          if (s >= 0 && s < 10) {
            lcd.print("0");
            lcd.print(s);
          }//количество секунд
          else {
            lcd.print(s);
          }

          lcd.setCursor(10, 0);
          lcd.print(error);
          lcd.setCursor(12, 0);
          lcd.print("/");
          lcd.setCursor(13, 0);
          lcd.print(pump_result);
          //
          //выводим значение часов
          lcd.setCursor(0, 1);
          //добавляем 0
          if (hs >= 0 && hs < 10) {
            lcd.print("0");
            lcd.print(hs);
          }//количество часов
          else {
            lcd.print(hs);
          }
          lcd.setCursor(2, 1);
          //выводим символ ":"между часами и минутами
          lcd.print(":");
          //выводим значение минут
          lcd.setCursor(3, 1);
          //добавляем 0
          if (ms >= 0 && ms < 10) {
            lcd.print("0");
            lcd.print(ms);
          }//количество минут
          else {
            lcd.print(ms);
          }

         /* lcd.setCursor(5, 1);
          //выводим символ ":"между часами и минутами
          lcd.print(":");
          //выводим значение минут
          lcd.setCursor(6, 1);
          //добавляем 0
          if (ss >= 0 && ss < 10) {
            lcd.print("0");
            lcd.print(ss);
          }//количество минут
          else {
            lcd.print(ss);
          }*/

          //вызываем функцию
          lcd_light();
          temp();
          //сравниваем время
          if (h == hs && m == ms && s == ss) {
            //ошибка
            if (error >= pump_result) {
              //помпа выключена
              digitalWrite(8, LOW);
              //показываем картнку
              lcd.setCursor(7, 0);
              lcd.print("\x86");
              //отправляем сообшение по указанному номеру с заданным текстом
             // gprs.sendSMS(PHONE_NUMBER, MESSAGE_ERROR);
              delay(2000);
            }
            else {
              //если все хорошо, включаем помпу
              digitalWrite(8, HIGH);
              Serial.println("Start to send message ...");
              //выводим каринку
              lcd.setCursor(7, 1);
              lcd.print("\x2A");
              // отправляем сообщение по указанному номеру с заданным текстом
              gprs.sendSMS(PHONE_NUMBER, MESSAGE_OK);
              //считаем количество включений помпы
              error++;
              Serial.println(error);
              //время работы помпы 5 сек
              delay(tmc);
              //выключаем помпу
              digitalWrite(pump, LOW);
              //удаляем каринку
              lcd.setCursor(7, 1);
              lcd.print(" ");
            }
          }
        }
      }
     

    Вложения:

  2. alp69

    alp69 Форумчанин

    На мой непросвещенный взгляд - при длительном нажатии (с точки зрения скорости работы кода) к предыдущему добавится несколько значений. Столько, сколько loop крутанется. А если еще учесть срабатывания из-за дребезга...
    Попробуйте нажатие использовать как начало процедуры обработки ее нажатия. При выполнении условия ее нажатия после задержки проверяете ее "отпущенность" и если она отпущена - увеличивайте значение.