порядок мигания светодиода в зависимости от положения потенциометра

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 25 ноя 2015.

Статус темы:
Закрыта.
  1. Толик Иванов

    Толик Иванов Administrator Администратор

    ЕСТЬ ПРОБЛЕМА!!! в моем проекте ардуино считывает данные через аналоговый вход с потенциометра и в зависимости от значений которые он передает заставляет гореть светодиод с определенной периодичностью. параллельно с этим транслируются данные с потенциометра через сериал соединение, а текущее условие мигания светодиода отображается на LCD дисплее.
    так вот при изменении параметров с потенциометра отрабатывают только первые 2 ветки- if и следующая за ней else if. все дальнейшие изменения с потенциометра никак не включают следующий режим мигания.
    вот ссылка на видеоописание проблемы:


    и схема подключения
    Untitled Sketch 3_схема.jpg


    Код (C++):
    int sensePin =0;
    int ledPin = 12;
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2,3,4,5,6,7);

    void setup() {
     
    Serial.begin(9600);

    lcd.begin(16,2);

    }

    void loop() {

    int pot=analogRead(sensePin);

    Serial.println(pot);

    if ( pot <= 72){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,1/1,3");
      digitalWrite (ledPin,HIGH);
      delay (100);
      digitalWrite (ledPin,LOW);
      delay (1300);
    } else if (73 <= pot <= 152){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,2/1,2");
      digitalWrite (ledPin,HIGH);
      delay (200);
      digitalWrite (ledPin,LOW);
      delay (1200);
    } else if (153 <= pot <= 232){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,3/1,1");
      digitalWrite (ledPin,HIGH);
      delay (300);
      digitalWrite (ledPin,LOW);
      delay (1100);
    } else if (233 <= pot <= 312){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,4/1,0");
      digitalWrite (ledPin,HIGH);
      delay (400);
      digitalWrite (ledPin,LOW);
      delay (1000);
    } else if (313<=pot<=392){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,5/0,9");
      digitalWrite (ledPin,HIGH);
      delay (500);
      digitalWrite (ledPin,LOW);
      delay (900);
    } else if (393<=pot<=472){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,6/0,8");
      digitalWrite (ledPin,HIGH);
      delay (600);
      digitalWrite (ledPin,LOW);
      delay (800);
    } else if (473<=pot<=552){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,7/0,7");
      digitalWrite (ledPin,HIGH);
      delay (700);
      digitalWrite (ledPin,LOW);
      delay (700);
    } else if (553<=pot<=632){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,8/0,6");
      digitalWrite (ledPin,HIGH);
      delay (800);
      digitalWrite (ledPin,LOW);
      delay (600);
    } else if (633<=pot<=712){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,9/0,5");
      digitalWrite (ledPin,HIGH);
      delay (900);
      digitalWrite (ledPin,LOW);
      delay (500);
    } else if (713<=pot<=792){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("1,0/0,4");
      digitalWrite (ledPin,HIGH);
      delay (1000);
      digitalWrite (ledPin,LOW);
      delay (400);
    } else if (793<=pot<=872){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("1,1/0,3");
      digitalWrite (ledPin,HIGH);
      delay (1100);
      digitalWrite (ledPin,LOW);
      delay (300);
    } else if (873<=pot<=952){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("1,2/0,2");
      digitalWrite (ledPin,HIGH);
      delay (1200);
      digitalWrite (ledPin,LOW);
      delay (200);
    } else if (953<=pot){
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("1,3/0,1");
      digitalWrite (ledPin,HIGH);
      delay (1300);
      digitalWrite (ledPin,LOW);
      delay (100);
    } else {
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,0/0,0");
    }
    }
     
  2. Salk

    Salk Гик

    В своем коде Вы зря понаставили "else" (иначе) между условиями, таким образом у Вас отрабатывается только первое.
    Вы говорите программе - если pot ниже 72, то делаем что-то, а все что больше (иначе) должно лежать только, в указанном диапазоне "73 - 152", и когда это есть, выполняется второе какое-то действие. Но на этом программа и останавливается. Дальше число диапазона "73 - 152" никак не может лежать в следующем указанном "153 - 232", вот Вам и затык.
    Else применяется к конкретному условию, а не служит для перехода между ними. В вашем случае нужно просто else удалить из кода, тогда каждое условие будет отрабатываться не зависимо друг от друга, отслеживая только параметр "pot".
    Код примет тогда такой вид:
    Код (C++):
    int sensePin = 0;
    int ledPin = 12;
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    void setup()
    {
      Serial.begin(9600);
      lcd.begin(16, 2);
    }

    void loop()
    {
      int pot = analogRead(sensePin);
      Serial.println(pot);

      if (pot <= 72)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,1/1,3");
        digitalWrite (ledPin, HIGH);
        delay (100);
        digitalWrite (ledPin, LOW);
        delay (1300);
      }
      if (73 <= pot <= 152)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,2/1,2");
        digitalWrite (ledPin, HIGH);
        delay (200);
        digitalWrite (ledPin, LOW);
        delay (1200);
      }
      if (153 <= pot <= 232)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,3/1,1");
        digitalWrite (ledPin, HIGH);
        delay (300);
        digitalWrite (ledPin, LOW);
        delay (1100);
      }
      if (233 <= pot <= 312)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,4/1,0");
        digitalWrite (ledPin, HIGH);
        delay (400);
        digitalWrite (ledPin, LOW);
        delay (1000);
      }
      if (313 <= pot <= 392)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,5/0,9");
        digitalWrite (ledPin, HIGH);
        delay (500);
        digitalWrite (ledPin, LOW);
        delay (900);
      }
      if (393 <= pot <= 472)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,6/0,8");
        digitalWrite (ledPin, HIGH);
        delay (600);
        digitalWrite (ledPin, LOW);
        delay (800);
      }
      if (473 <= pot <= 552)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,7/0,7");
        digitalWrite (ledPin, HIGH);
        delay (700);
        digitalWrite (ledPin, LOW);
        delay (700);
      }
      if (553 <= pot <= 632)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,8/0,6");
        digitalWrite (ledPin, HIGH);
        delay (800);
        digitalWrite (ledPin, LOW);
        delay (600);
      }
      if (633 <= pot <= 712)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,9/0,5");
        digitalWrite (ledPin, HIGH);
        delay (900);
        digitalWrite (ledPin, LOW);
        delay (500);
      }
      if (713 <= pot <= 792)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,0/0,4");
        digitalWrite (ledPin, HIGH);
        delay (1000);
        digitalWrite (ledPin, LOW);
        delay (400);
      }
      if (793 <= pot <= 872)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,1/0,3");
        digitalWrite (ledPin, HIGH);
        delay (1100);
        digitalWrite (ledPin, LOW);
        delay (300);
      }
      if (873 <= pot <= 952)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,2/0,2");
        digitalWrite (ledPin, HIGH);
        delay (1200);
        digitalWrite (ledPin, LOW);
        delay (200);
      }
      if (953 <= pot)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,3/0,1");
        digitalWrite (ledPin, HIGH);
        delay (1300);
        digitalWrite (ledPin, LOW);
        delay (100);
      }
      else // все что выше 953
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,0/0,0");
      }
    }
    Да, и мне показалось странным, что при минимальном положении потенциометра в Serial падают цифры "15-17", а не около 0, такое ощущение, что между аналоговым входом и GND остаётся какое-то сопротивление.
    Можно ещё сократить строчки кода и избавится от переменной "pot" прописав условия напрямую:
    Код (C++):
    if (analogRead(sensePin) <= 72)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,1/1,3");
        digitalWrite (ledPin, HIGH);
        delay (100);
        digitalWrite (ledPin, LOW);
        delay (1300);
      }
    Да, и от delay лучше избавляться, почитайте про таймеры millis(), которые не тормозят выполнение всего кода.
     
    Последнее редактирование: 25 ноя 2015
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    спасибо! сейчас попробую без else, минимальное сопротивление на видео было 16-18 из-за плохого контакта на макетной площадке. поправил и стало "0".
    ну и посмотрю что это за millis)))
     
  4. Толик Иванов

    Толик Иванов Administrator Администратор

    попробывал... теперь на дисплее выводятся по очереди все режимы... от 0,1/1,3 до 1,3/0,1 не зависимо от положения потенциометра. и в сериал порт записывается значение положения потенциометра после прохода всего цикла loop, приблизительно раз в 15 секунд. не получилось...
     
  5. Salk

    Salk Гик

    уберите, на время, все delay из кода.
    Ну можете delay(100); в конце loop оставить, чтобы значения не так часто бомбардировали Serial.
    Ах да, вот это условие неверное:
    Код (C++):
    if (953 <= pot)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,3/0,1");
        digitalWrite (ledPin, HIGH);
        delay (1300);
        digitalWrite (ledPin, LOW);
        delay (100);
      }
      else // все что ниже 953, зачем?
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,0/0,0");
      }
    уберите
    Код (C++):
    else
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,0/0,0");
      }
     
  6. Толик Иванов

    Толик Иванов Administrator Администратор

    я делей убрать полностью не могу так как первый делей задерживает светодиод включенным, а второй показывает на сколько я его выключаю, эмитируя тем самым продолжительность дня и ночи. смогу возможно в дальнейшем заменить на предложенные millis, но пока поидее и так должно работать. сериал показывает только раз в начале скорее всего потому как собственно команда вывода находится в начале кода и потом обновляется после проигрывания по очереди всех if. сейчас пробую сделать вложение типа матрешки в каждом else будет новый if в конце которого будет опять новый else , после чего будет цепочка из закрывающих фигурных скобочек.
     
  7. Salk

    Salk Гик

    Ниче не понял. Хочется ждать каждый раз по несколько секунд, ждите.
    Из-за этих "имитаций" потенциометр опрашивается раз в несколько секунд, после того как отмигают ваши светодиоды, в корне не верно.
    У Вас конечное условие не верно, удалите его. Оставьте только
    Код (C++):
    if (953 <= pot)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,3/0,1");
        digitalWrite (ledPin, HIGH);
        delay (1300);
        digitalWrite (ledPin, LOW);
        delay (100);
      }
     
  8. Толик Иванов

    Толик Иванов Administrator Администратор

    в конце последним else я оставлю
    Код (C++):
    else {
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,0/0,0");
    }
    он диод не будет включать а выведет на дисплей 0,0/0,0 как ошибку

    чтоб было понятней поясню что есть такие таймеры включения и выключения допустим розеток на которых выставляется сколько в день розетка будет включена и сколько будет выключена. так вот уменьшенную копию такого "таймера" я и пытаюсь реализовать и развить дальше в каком либо устройстве.
     
  9. Толик Иванов

    Толик Иванов Administrator Администратор

    написал следующее
    Код (C++):
    int sensePin = 0;
    int ledPin = 12;
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    void setup()
    {
      Serial.begin(9600);
      lcd.begin(16, 2);
    }

    void loop()
    {
      int pot = analogRead(sensePin);
      Serial.println(pot);

      if (pot <= 72)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,1/1,3");
        digitalWrite (ledPin, HIGH);
        delay (100);
        digitalWrite (ledPin, LOW);
        delay (1300);
      } else{
    int pot = analogRead(sensePin);  
         if (73 <= pot <= 152){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,2/1,2");
        digitalWrite (ledPin, HIGH);
        delay (200);
        digitalWrite (ledPin, LOW);
        delay (1200);
      } else{
    int pot = analogRead(sensePin);
        if (153 <= pot <= 232){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,3/1,1");
        digitalWrite (ledPin, HIGH);
        delay (300);
        digitalWrite (ledPin, LOW);
        delay (1100);
      } else{
    int pot = analogRead(sensePin);
        if (233 <= pot <= 312){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,4/1,0");
        digitalWrite (ledPin, HIGH);
        delay (400);
        digitalWrite (ledPin, LOW);
        delay (1000);
      } else{
    int pot = analogRead(sensePin);
        if (313 <= pot <= 392){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,5/0,9");
        digitalWrite (ledPin, HIGH);
        delay (500);
        digitalWrite (ledPin, LOW);
        delay (900);
      } else{
    int pot = analogRead(sensePin);
        if (393 <= pot <= 472){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,6/0,8");
        digitalWrite (ledPin, HIGH);
        delay (600);
        digitalWrite (ledPin, LOW);
        delay (800);
      } else{
    int pot = analogRead(sensePin);
        if (473 <= pot <= 552){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,7/0,7");
        digitalWrite (ledPin, HIGH);
        delay (700);
        digitalWrite (ledPin, LOW);
        delay (700);
      } else{
    int pot = analogRead(sensePin);
        if (553 <= pot <= 632){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,8/0,6");
        digitalWrite (ledPin, HIGH);
        delay (800);
        digitalWrite (ledPin, LOW);
        delay (600);
      } else{
    int pot = analogRead(sensePin);
        if (633 <= pot <= 712){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,9/0,5");
        digitalWrite (ledPin, HIGH);
        delay (900);
        digitalWrite (ledPin, LOW);
        delay (500);
      } else{
    int pot = analogRead(sensePin);
        if (713 <= pot <= 792){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,0/0,4");
        digitalWrite (ledPin, HIGH);
        delay (1000);
        digitalWrite (ledPin, LOW);
        delay (400);
      } else{
    int pot = analogRead(sensePin);
        if (793 <= pot <= 872){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,1/0,3");
        digitalWrite (ledPin, HIGH);
        delay (1100);
        digitalWrite (ledPin, LOW);
        delay (300);
      } else{
    int pot = analogRead(sensePin);
        if (873 <= pot <= 952){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,2/0,2");
        digitalWrite (ledPin, HIGH);
        delay (1200);
        digitalWrite (ledPin, LOW);
        delay (200);
      } else{
    int pot = analogRead(sensePin);
        if (953 <= pot){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,3/0,1");
        digitalWrite (ledPin, HIGH);
        delay (1300);
        digitalWrite (ledPin, LOW);
        delay (100);
      } else {
     
      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,0/0,0");
    }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
       
      }
      }
    но ничего не изменилось...
     
  10. Толик Иванов

    Толик Иванов Administrator Администратор

    может мне нужно отойти от if else?
     
  11. Salk

    Salk Гик

    По логике должно работать или я что-то упускаю из виду, возможно не правильно сформулировано само условие. Вот я переписал код, сейчас все работает, только допишите остальные условия:
    Код (C++):
    int sensePin = A0;
    int ledPin = 12;
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    void setup()
    {
      Serial.begin(9600);
      lcd.begin(16, 2);
    }

    void loop()
    {
      // int pot = analogRead(sensePin);

      if (analogRead(sensePin) < 72) // если меньше 72
      {
        Serial.print(analogRead(sensePin));
        Serial.print("  ");
        Serial.println("0,1/1,3");
      }
      if (analogRead(sensePin) > 72 && analogRead(sensePin) < 152) // если больше 72 и меньше 152
      {
        Serial.print(analogRead(sensePin));
        Serial.print("  ");
        Serial.println("0,2/1,2");
      }
    Безымянны1й.jpg Безымянный.jpg
    Так же добавите свои светодиоды и вывод на дисплей, но задержки delay лучше сразу опустить, так как опрос потенциометра будет раз в какое-то время (указанное вами delay()). Т.е. будет инерция при вращении потенциометра, крутите, ждете пока светодиоды промаргаются и только после этого снова крутите.
    Ну да, мы с Вами не правильно формируем условие if, в С++ формулировка
    Код (C++):
    if (393 <= pot <= 472)
    не совсем корректна и будет приравнена к
    Код (C++):
    if (393 <= pot
    поэтому диапазоны лучше указывать через оператор "И" "&&"
     
    Последнее редактирование: 25 ноя 2015
    Толик Иванов нравится это.
  12. Толик Иванов

    Толик Иванов Administrator Администратор

    а знаете что я накосячил? и какая разница между Вашим последним кодом и моим предыдущим?
    вы пишите (analogRead(sensePin)>72&& analogRead(sensePin)<152)
    а я пишу (73 <=analogRead(sensePin)<= 152)

    я данные с потенциометра ставил просто в середину знаков равенства, а вы делаете через && !!!
    похоже что просто делать как я нельзя и нужно использовать именно &&
    сейчас в своем коде поменял выражение равенства по примеру как у Вас и все заработало с delay, светодиодом и так далее!!! короче заработало после правильной записи выражения равенства! Спасибо!!!
     
  13. Salk

    Salk Гик

    Не все что логично в жизни, логично в C++ :) Тоже виноват, что сразу не обратил на это внимание.
    Рад что помог.
     
  14. geher

    geher Гуру

    Основная проблема первого варианта в условиях вида
    73 <= pot <= 152
    Подозреваю, что они вычисляются совсем не так, как задумано автором. Точнее автором задумано совсем не то, что написано.
    Операторы одинаковые, с двумя параметрами. Потому приоритет не работает и все вычисляется слева направо.
    Т.е. по факту сначала вычисляется 73 <= pot. Получается либо 0 (false), либо 1 (true).
    Дальше результат сравнивается с 152. А поскольку и 1, и 0 меньше или равны 152, то результат всего условия всегда истина.
    А else там вроде совершенно не мешали.
    На самом деле подобная конструкция с двумя операторами сравнения и тремя значениями, одно из которых переменная, иногда может иметь смысл. Хотя и трудно представить, в каких именно случаях.
    Просто следует понимать, как оно в языке С/С++ вычисляется.
     
    Последнее редактирование: 25 ноя 2015
    Толик Иванов нравится это.
  15. Толик Иванов

    Толик Иванов Administrator Администратор

    вы совершенно правы, реально так походу и получилось в моем первоначальном коде , поэтому собственно дальше первой ветки else код и не работал. но я еще не столь умен чтоб такое предугадать)))
     
  16. Salk

    Salk Гик

    А ведь действительно :confused:
     
  17. Толик Иванов

    Толик Иванов Administrator Администратор

    кто может мне помочь на моем примере хотя бы в одной ветке if показать как вместо delay сделать тоже самое на millis? вот рабочая программа на delay
    Код (C++):
    int sensePin = 0;
    int ledPin = 12;
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    void setup()
    {
      Serial.begin(9600);
      lcd.begin(16, 2);
    }

    void loop()
    {
      int pot = analogRead(sensePin);
      Serial.println(pot);

      if (pot < 73)
      {
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,1/1,3");
        digitalWrite (ledPin, HIGH);
        delay (100);
        digitalWrite (ledPin, LOW);
        delay (1300);
      } else{
    int pot = analogRead(sensePin);
         if (72 < pot&&pot < 153){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,2/1,2");
        digitalWrite (ledPin, HIGH);
        delay (200);
        digitalWrite (ledPin, LOW);
        delay (1200);
      } else{
    int pot = analogRead(sensePin);
        if (152 < pot&&pot < 233){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,3/1,1");
        digitalWrite (ledPin, HIGH);
        delay (300);
        digitalWrite (ledPin, LOW);
        delay (1100);
      } else{
    int pot = analogRead(sensePin);
        if (232 < pot&&pot < 313){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,4/1,0");
        digitalWrite (ledPin, HIGH);
        delay (400);
        digitalWrite (ledPin, LOW);
        delay (1000);
      } else{
    int pot = analogRead(sensePin);
        if (312 < pot&&pot < 393){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,5/0,9");
        digitalWrite (ledPin, HIGH);
        delay (500);
        digitalWrite (ledPin, LOW);
        delay (900);
      } else{
    int pot = analogRead(sensePin);
        if (392 < pot&&pot < 473){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,6/0,8");
        digitalWrite (ledPin, HIGH);
        delay (600);
        digitalWrite (ledPin, LOW);
        delay (800);
      } else{
    int pot = analogRead(sensePin);
        if (472 < pot&&pot < 553){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,7/0,7");
        digitalWrite (ledPin, HIGH);
        delay (700);
        digitalWrite (ledPin, LOW);
        delay (700);
      } else{
    int pot = analogRead(sensePin);
        if (552 < pot&&pot < 633){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,8/0,6");
        digitalWrite (ledPin, HIGH);
        delay (800);
        digitalWrite (ledPin, LOW);
        delay (600);
      } else{
    int pot = analogRead(sensePin);
        if (632 < pot&&pot < 713){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("0,9/0,5");
        digitalWrite (ledPin, HIGH);
        delay (900);
        digitalWrite (ledPin, LOW);
        delay (500);
      } else{
    int pot = analogRead(sensePin);
        if (712 < pot&&pot < 793){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,0/0,4");
        digitalWrite (ledPin, HIGH);
        delay (1000);
        digitalWrite (ledPin, LOW);
        delay (400);
      } else{
    int pot = analogRead(sensePin);
        if (792 < pot&&pot < 873){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,1/0,3");
        digitalWrite (ledPin, HIGH);
        delay (1100);
        digitalWrite (ledPin, LOW);
        delay (300);
      } else{
    int pot = analogRead(sensePin);
        if (872 < pot&&pot < 953){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,2/0,2");
        digitalWrite (ledPin, HIGH);
        delay (1200);
        digitalWrite (ledPin, LOW);
        delay (200);
      } else{
    int pot = analogRead(sensePin);
        if (952 < pot){
        lcd.print("         day/ngt");
        lcd.setCursor(9, 1);
        lcd.print("1,3/0,1");
        digitalWrite (ledPin, HIGH);
        delay (1300);
        digitalWrite (ledPin, LOW);
        delay (100);
      } else {

      lcd.print("         day/ngt");
      lcd.setCursor(9, 1);
      lcd.print("0,0/0,0");
    }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
     
      }
      }
    пока чет не догоняю как работать на miliis, на delay все по порядку идет, а c расчетами millis даже не знаю с чего начать.
     
  18. Salk

    Salk Гик

    Код с комментариями. Осталось только дописать вывода на LCD-экран и оставшиеся условия.
    Код (C++):
    int sensePin = A0; // Аналоговый вход
    int ledPin = 12;   // Пин подключения светодиода
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    int TIME_BLINK_LED1; // переменная в которой хранится время, за которое светодиод горит
    unsigned long int time_blink_led1; // перменная для хранения значения millis()
    int TIME_BLINK_LED2; // переменная в которой хранится время, за которое светодиод не горит
    unsigned long int time_blink_led2; // перменная для хранения значения millis()

    void setup()
    {
      Serial.begin(9600);
      lcd.begin(16, 2);
      pinMode(ledPin, OUTPUT);     // обязательно нужно сконфигурировать пин светодиода на выход, не забывайте!
      digitalWrite(ledPin, LOW);   // Начальное состояние светодиода - выключен
    }

    void loop()
    {
      // считываем значения
      if (analogRead(sensePin) < 72) // если меньше 72
      {
        Serial.print(analogRead(sensePin));
        Serial.print("  ");
        Serial.println("0,1/1,3");
        // Таймеры
        TIME_BLINK_LED1 = 100;  // время свечения светодиода
        TIME_BLINK_LED2 = 1300; // время не свечения
        // Если прошло времени больше 100 мс (TIME_BLINK_LED1), то
        if (millis() - time_blink_led1 > TIME_BLINK_LED1)
        {
          // включаем светодиод
          digitalWrite(ledPin, HIGH);
          // Если прошло времени больше, чем 1300 мс, то
          if (millis() - time_blink_led2 > TIME_BLINK_LED2)
          {
            // выключаем светодиод
            digitalWrite(ledPin, LOW);
            // сбрасываем таймеры, чтобы цикл повторился
            time_blink_led1 = millis();
            time_blink_led2 = millis();
          }
        }
      }
      if (analogRead(sensePin) >= 72 && analogRead(sensePin) < 152) // если больше 72 и меньше 152
      {
        Serial.print(analogRead(sensePin));
        Serial.print("  ");
        Serial.println("0,2/1,2");
        // установим новые значения таймеров, т.к. нам надо изменить частоту мигания светодиода
        TIME_BLINK_LED1 = 200;  // время свечения светодиода
        TIME_BLINK_LED2 = 1200; // время не свечения
        // Если прошло времени больше 200 мс (TIME_BLINK_LED1), то
        if (millis() - time_blink_led1 > TIME_BLINK_LED1)
        {
          // включаем светодиод
          digitalWrite(ledPin, HIGH);
          // Если прошло времени больше, чем 1200 мс, то
          if (millis() - time_blink_led2 > TIME_BLINK_LED2)
          {
            // выключаем светодиод
            digitalWrite(ledPin, LOW);
            // сбрасываем таймеры, чтобы цикл повторился
            time_blink_led1 = millis();
            time_blink_led2 = millis();
          }
        }
      }
      if (analogRead(sensePin) >= 152 && analogRead(sensePin) < 233) // если больше 152 и меньше 233
      {
        Serial.print(analogRead(sensePin));
        Serial.print("  ");
        Serial.println("0,3/1,1");
        // установим новые значения таймеров, т.к. нам надо изменить частоту мигания светодиода
        TIME_BLINK_LED1 = 300;  // время свечения светодиода
        TIME_BLINK_LED2 = 1100; // время не свечения
        // Если прошло времени больше 300 мс (TIME_BLINK_LED1), то
        if (millis() - time_blink_led1 > TIME_BLINK_LED1)
        {
          // включаем светодиод
          digitalWrite(ledPin, HIGH);
          // Если прошло времени больше, чем 1100 мс, то
          if (millis() - time_blink_led2 > TIME_BLINK_LED2)
          {
            // выключаем светодиод
            digitalWrite(ledPin, LOW);
            // сбрасываем таймеры, чтобы цикл повторился
            time_blink_led1 = millis();
            time_blink_led2 = millis();
          }
        }
      }
    }
     
    Толик Иванов нравится это.
  19. Толик Иванов

    Толик Иванов Administrator Администратор

    спасибо! сейчас попробую разобраться
     
  20. Толик Иванов

    Толик Иванов Administrator Администратор

    следующим шагом будет подключение к часам реального времени, как только я их куплю)))
     
Статус темы:
Закрыта.