Помогите заменить delay на millis

Тема в разделе "Arduino & Shields", создана пользователем ArtemFBR, 22 янв 2022.

  1. ArtemFBR

    ArtemFBR Нуб

    Код (C++):
    void loop() {
    int flag = analogRead(a0);
    if(flag < 730 && flag > 718){
    lcd.setCursor(10, 2);
    lcd.print("1");
    delay(100);
    }else if(flag < 490 && flag > 470){
    lcd.setCursor(10, 2);
    lcd.print("2");
    delay(100);
    }else if(flag < 310 && flag > 300){
    lcd.setCursor(10, 2);
    lcd.print("3");
    delay(100);
    }else if(flag < 140 && flag > 125){
    lcd.setCursor(10, 2);
    lcd.print("4");
    delay(100);
    }else if(flag < 10 && flag >= 0){
    lcd.setCursor(10, 2);
    lcd.print("5");
    delay(100);
    }
     
    Последнее редактирование: 22 янв 2022
  2. SergeiL

    SergeiL Оракул Модератор

    Нет!!!

    Сначала учимся вставлять код в соответствии с правилами форума!
    Уже же предупреждали!
    [​IMG]
     
  3. ArtemFBR

    ArtemFBR Нуб

    щас исправим
     
  4. Airbus

    Airbus Радиохулиган Модератор

    А с какой целью заменить? Чисто для самообразования? Я дак не вижу смысла в этой замене именно в Вашем коде. Можно тупо убрать все delay
     
  5. ArtemFBR

    ArtemFBR Нуб

    скетч потом не обрабативает нажатие кнопки если убрать. смисла нет это 1/6 часть кода а мне остановка мк не нужна
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Не увидел там нажатия кнопок ну да ладно. Убери delay совсем. Зачем он там?
     
  7. ArtemFBR

    ArtemFBR Нуб

    ты понимаеш потом ничего не работает если убрать делей
     
  8. Andy16

    Andy16 Гик

    Так что ли (не проверял)?
    Код (Text):

    unsigned long f = 0;

    void loop() {

    if (millis() - f > 100) {
    f = millis();
    int flag = analogRead(a0);
    if(flag < 730 && flag > 718){
      lcd.setCursor(10, 2);
      lcd.print("1");
      }else if(flag < 490 && flag > 470){
      lcd.setCursor(10, 2);
      lcd.print("2");
      }else if(flag < 310 && flag > 300){
      lcd.setCursor(10, 2);
      lcd.print("3");
      }else if(flag < 140 && flag > 125){
      lcd.setCursor(10, 2);
      lcd.print("4");
      }else if(flag < 10 && flag >= 0){
      lcd.setCursor(10, 2);
      lcd.print("5");
    }
    }

     
     
  9. akl

    akl Гуру

    этого недостаточно для стабильной работы аналоговых кнопок. напряжение после нажатия кнопки устанавливается не сразу, а значит эта фигня сработав в любой момент, может зафиксировать любую из кнопок, напряжение которых выше правильной.
    То есть для правильной работы надо сперва засечь что напряжение упало, затем подождать какое-то время, и после этого еще раз считать напряжение.
    или как вариант - срабатывать только если какой-то уровень напряжения был зафиксирован два раза подряд через некоторый промежуток времени
     
  10. Andy16

    Andy16 Гик

    Спору нет, но человек попросил убрать delay, а не написать алгоритм обработки кнопок. :)
     
  11. Andy16

    Andy16 Гик

    Нашел древний исходник того, что у меня обслуживает кнопки на улице. Там не так сложно:
    Код (Text):
     ti = millis();
    ar = analogRead(inpin);
    if (abs(ar - ar0) < 100) {
      sw0 = sw;
      if (ar > 900) { sw = 0; }
      else if ((ar < 900) && (ar > 800)) { sw = 1; }
      else if ((ar < 800) && (ar > 700)) { sw = 2; }
      else if ((ar < 700) && (ar > 600)) { sw = 3; }
      else if ((ar < 600) && (ar > 500)) { sw = 4; }
      else if (ar < 500) { sw = 5; }
      if (sw0 != sw) {
       switch (sw) {

       ........

    ar0 = ar;
     
     
  12. akl

    akl Гуру

    я так понял - сработает если два подряд значения отличаются меньше чем на 100. но время между измерениями должно быть определенное (не меньше какого-то), в зависимости от дребезгливости кнопок и скорости изменения напряжения
     
  13. Andy16

    Andy16 Гик

    Посмотрел: там стоит в конце delay(150) :)
    Но, работает много лет нормально. Причем, кнопок по несколько одинаковых. И разные они - на улице такой огромный блок от станка какого-то.
    Если автор темы хочет, могу кинуть ему полный исходник.
     
  14. parovoZZ

    parovoZZ Гуру

    Потому как это говнокод. Делай можно запросто вынести за скобки. Миллис здесь никоим не поможет.
    А опрос кнопок необходимо делать не в каждом цикле процессора, а один раз в 20-50 мс. Это автоматически подавит их дребезг.
     
    Airbus нравится это.
  15. Рокки1945

    Рокки1945 Гуру

    Если нет необходимости долбится в цикле то опрашивать аналоговый как цифровой - если кнопка нажата то там больше нуля и уходить в функцию а там уже считывать аналоговый вход
     

    Вложения:

  16. ArtemFBR

    ArtemFBR Нуб

    буду пробовать все вашы варианты спасибо
     
  17. ArtemFBR

    ArtemFBR Нуб

    я с миллис не очень дружу
     
  18. b707

    b707 Гуру

    ну так подружитесь, без миллис вы избавится от делей не сможете
     
  19. Andy16

    Andy16 Гик

    Зачем дружиться с функциями? Просто используй. Совсем простая же, даже без аргументов. Запомнил значение при выполнении своего блока, потом запускаешь блок, если новое значение миллис больше запомненного на нужную величину.
     
  20. ArtemFBR

    ArtemFBR Нуб

    та вот тысячу статтей прочытал и видео уроков посмотрел непойму как это работает и все