Очередной "умный" код, помогайте

Тема в разделе "Arduino & Shields", создана пользователем shamzelia, 28 июн 2017.

  1. shamzelia

    shamzelia Нерд

    В общем все как обычно, замахнулся на контроллер и полив и все на свете.

    Решил, что ключевой задачей является "АлармСтоп" и начал его реализовывать, но вот беда, в case 2 Значение AlarmCounter уже явно больше 3 (3 и более на дисплей вывел) а перехода в case 6 никак не происходит...




    Код (C++):

    // Объявляем переменные и константы:
          uint8_t        modState    = 0;    /* при старте   */      
          uint8_t     AlarmCounter;


    void setup() {

    void loop() {

    int i=0; //необходимо для цикла создать переменную
    int lefti=0; //необходимо для вычисления оставшегося времени


      switch(modState){
    //  Устройство дежурное состояние или только запущено
        case 0:    
                               AlarmCounter = 0;    

        break;
    //  Устройство в режиме ожидания (после полива) для пропитывания почвы водой
        case 1: i = 0;
                lefti = 0;
                lcd.clear();
                lcd.setCursor(0, 0);
                lcd.print("Wait");
                while (i<500){
                               
                lefti = (500-(i));                
                lcd.setCursor(0, 1);
                lcd.print(lefti);
                lcd.setCursor(0, 3);
                lcd.print(F("HUM1=  %"));      
                lcd.setCursor(5, 3);
                lcd.print(lastHum1);
                i++;
                }
                                         
             
                 modState=2;            
               
        break;
    //  Устройство активно и опрашивает датчик влажности почвы
        case 2:            AlarmCounter=AlarmCounter+1;
                               i = 0;
                               lefti = 0;
                               digitalWrite(RELAYSENS,LOW);
                               lcd.clear();
                               lcd.setCursor(0, 0);
                               lcd.print("Sensor Activate");
                               while (i<500){                                        // приблизительно
                               lcd.setCursor(0, 1);
                               lefti = (500-(i));
                               lcd.print(lefti);
                               HUM1_result = analogRead(PIN_hum1);                      // опрашиваем датчик влажности почвы
                               sensorHum1 = map(HUM1_result, 0, 1023, 100, 0);      // задаем вывод только двоичного значения процентном соотношении
                               lastHum1 = (sensorHum1);
                               lcd.setCursor(0, 3);
                               lcd.print(F("HUM1=  %"));        // Выводим последнее сохраненное значение влажности почвы
                               lcd.setCursor(5, 3);
                               lcd.print(lastHum1);
                               lcd.setCursor(5, 2);
                               lcd.print(AlarmCounter);
                               i++;
                               }
                               if (AlarmCounter >= 3) {modState=6;}      //  на отрез не работает
                               if (lastHum1 <= 10) {modState=3;} else {modState=0; lcd.clear();}

       
        break;
    //  Устройство в режиме полива
        case 3:              i = 0;
                             lefti = 0;
                             digitalWrite(RELAY3,LOW);           //включаем полив
                             lcd.clear();
                             lcd.setCursor(0, 0);
                             lcd.print("watering");
                             LastTimeH = (time.Hours);
                             LastTimeM = (time.minutes);
                             lcd.setCursor(15, 3);
                             lcd.print(LastTimeH);
                             lcd.setCursor(17, 3);
                             lcd.print(":");
                             lcd.setCursor(18, 3);
                             lcd.print(LastTimeM);
                             while (i<500){
                             lefti = (500-(i));
                             lcd.setCursor(0, 1);
                             lcd.print(lefti);
                             lcd.setCursor(0, 3);
                             lcd.print(F("HUM1=  %"));        // Выводим последнее сохраненное значение влажности почвы
                             lcd.setCursor(5, 3);
                             lcd.print(lastHum1);
                             i++;
                             }
        modState=1;
                           
        break;
    //  Устройство в режиме установки пороговой влажности почвы
        case 4:
        break;
    //  Устройство в режиме установки длительность полива
        case 5:
        break;
       
    //  Устройство в режиме Аварийной остановки
        case 6:                lcd.clear();
                               lcd.setCursor(0, 0);
                               lcd.print(" * * A L A R M * *");
                               lcd.setCursor(0, 2);
                               lcd.print("False Watering !");
                               lcd.setCursor(9, 3);
                               lcd.print(AlarmCounter);
        break;
      }                                    
    }

     



    Постарался обрезать код до минимума, если нужно выложу полную версию.
     
  2. qwone

    qwone Гик

    Беда не в этом. Основная беда в том что вы очень слабы в программировании, как языка Си, так и как правильнее программировать. Или за вас написать программу или же выкладывать по шагам что и как делать. В любом случае это очень много моего труда.
     
  3. fogary

    fogary Гик

    Код (C++):
    if (AlarmCounter >= 3) {modState=6;}      //  на отрез не работает
    if (lastHum1 <= 10) {modState=3;} else {modState=0; lcd.clear();}
    Когда первое условие выполняется, то "modState=6", а следом второе условие меняет значение
    modState на 3 или 0. По этому, в "case 2" переменная modState никогда не будет иметь значение 6.

    Если Вы хотите что бы вторая проверка выполнялось только когда AlarmCounter < 3, то попробуйте так:
    Код (C++):
    if (AlarmCounter >= 3) {
      modState=6;
    } else {
      if (lastHum1 <= 10) {
        modState=3;
      } else {
        modState=0;
        lcd.clear();
      }
    }
    или так:
    Код (C++):
    if (AlarmCounter >= 3) {
      modState=6;
      break;
    }
    if (lastHum1 <= 10) {
      modState=3;
    } else {
      modState=0;
      lcd.clear();
    }
    В "case 6" у Вас почему-то не изменяется значение modState, так и задумано?
     
    shamzelia нравится это.
  4. qwone

    qwone Гик

    Код (C++):
    /*Cl_controller.ino
    */

    //---------------Cl_controller--------------------
    enum en_stat {
      NOWATERING, // нет полива
      WATERING,   // полив
      ALARM,      // остановка по ошибке
      SETTLING    // установка
    };
    class Cl_controller {
        en_stat stat;
        uint32_t past;
        uint32_t time; // время полива
        const byte Relay_pin;// нога реле насосаполива
      public:
        Cl_controller(byte pin): Relay_pin(pin) {}
        void setup() {
          stat = NOWATERING;
          pinMode(Relay_pin, OUTPUT);
          digitalWrite(Relay_pin, LOW); // не поливать
        }
        void loop() {
          if (WATERING && millis() - past >= time) {
            stat = NOWATERING;
            digitalWrite(Relay_pin, LOW); // не поливать
          }
        }
        void watering(uint32_t _time) { // полить столько времени
          time = _time;
          stat = WATERING;
          past = millis();
          digitalWrite(Relay_pin, 1); // начать полив
        }
    };
    //---------------------компоновка--------------------------------------------
    Cl_controller Controller(/*нога реле полива*/2);
    //----------------------main()------------------------------------------------
    void setup() {
      Controller.setup();

    }

    void loop() {
      Controller.loop();

    }
     
    Tomasina нравится это.
  5. shamzelia

    shamzelia Нерд


    Да, это пока такая задумка, за растолковывание спасибо огромное, сам не допер почемуто (((
     
  6. shamzelia

    shamzelia Нерд


    Исполнение идеи я так понимаю на 5+, но ,не обижайтесь, делится знаниями не ваш конек ) (без коментариев код понятен только вам и другим специалистам...), не тратьте свое бесценное божественное время на всяких нубов, вы же родились таким...
     
    Tomasina нравится это.
  7. mcureenab

    mcureenab Гуру

    Тут хрень

    Код (C++):
          if (WATERING && millis() - past >= time) {
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    почему? Вроде корректно.
     
  9. mcureenab

    mcureenab Гуру

    формально - корректно. Фактически - хрень. WATERING это сколько?
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    Константа, равная единице. Определена в enum en_stat.

    Кажись понял. Надо if (stat == WATERING && ...
     
  11. qwone

    qwone Гик

    А жаловаться зачем. (1)Комментариев в программе столько сколько надо. Избыток комментариев портит понимаемость программы. (2) Вы выложили код, ТЗ, описали что и как делается. Нет. Ах тогда чего обижаться, если вы и ваши близкие родились с телепатией и хрустальным шаром в руках, то извините я нет. (3) я показал направление как правильнее писать. А дальше гугл и учебники. Или вам здесь объянить что такое гугл или что такое учебники и как с помощью их учится. Я предпочитаю их читать, а не ложить под подушку на ночь.
     
  12. qwone

    qwone Гик

    Ну да. Код скорее эскизный, чем рабочий. Для рабочего нужно знать ТЗ, потом собрать на макетке и провести бета-тестирование. Так что код это просто направление,или вариант направления программы.
     
  13. shamzelia

    shamzelia Нерд

    Ну вообщемто пилю я свою теплушку... пока вроде выходит понемногу,
    Хочу но пока не сделано:
    1) кнопки
    2) Наполнение емкости с водой
    3) Включение досветки
    4) вывод данных в сеть

    вышло пока так:
     

    Вложения:

    ИгорьК нравится это.
  14. shamzelia

    shamzelia Нерд

    Ключевые задачи, которые пытаюсь решать по ходу событий:
    1) интуитивно понятный интерфейс
    2) минимизация расхода выводов (аналоговых и цифровых)
    3) Гибкость в настройке без подключения к компьютеру
     
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Занимаюсь нынче практически тем же самым.
    SmartSelectImage_2017-06-30-06-22-22.png

    SmartSelectImage_2017-06-30-06-22-47.png

    SmartSelectImage_2017-06-30-06-24-27.png
     
    Последнее редактирование: 30 июн 2017
    shamzelia нравится это.
  16. shamzelia

    shamzelia Нерд

  17. ИгорьК

    ИгорьК Гуру

    Все открыто.
    Но проект на ESP-8266 и без дисплея. Опыт показал что не на что там смотреть.
    В остальном все то же самое. Это вторая часть соответствующего проекта.
    В прошлом году на скорую руку, в этом уже понял основные моменты - что главное что второстепенное.
    Скоро выложу и разрисую все.