Как создать цикл с условием прерывания выполнения? Выход из цикла

Не могу понять как сделать условие в диапазоне «от» и «до».
Речь о LCD Keyboard Shield. Значение читается с пинa A0. Диапазон 0 - 1023.
У каждой кнопки значение от «от» и «до». Но если я к примеру пишу:
" if (val >= 700 && val <= 800) " (диапазон), это не работает. Так как значение всегда будет либо больше, либо меньше этого диапазона.
Я нигде не нашёл как сделать сравнение не менее 700, но не больше 800. Как сделать такой диапазон? Если больше 700, но не больше 800.

Так и сделать

if (val >= 700 && val <= 800)
 {
// здесь код
  }

Покажите код, к котором это “не работает”

void btn_select() // Кнопка “Выбор”
{
analogWrite(10, 255); // Установить максимальную яркость подсветки
lcd.clear();

for (int count = 0; count < 3000; count++)
{
lcd.setCursor(6,0);
lcd.print (“MENU”);
lcd.setCursor(6,1);
lcd.print (“TEST”);

    if (analogRead (A0) > 700 && analogRead (A0) <= 800)
   {
      return;
   }
 }

}

И в чем выражается “не работает”? Этот код и должен ничего не делать

что это за обрывки кода? Выложите готовый скетч, который другие могли бы запустить у себя.
И вставляйте код в сообщение правильно.

#define PERIOD1 40000                         // Период в миллисекундах (Через сколько потухнет дисплей)
#define PERIOD2 100                           // Период в миллисекундах (Обновление дисплея)
// #define PERIOD3 20000
#include <LiquidCrystal.h>                    // Библиотека управления дисплеем
#include <microDS18B20.h>                     // Библиотека чтения температуры
#include <iarduino_RTC.h>                     // Библиотека работы с модулем часов
LiquidCrystal lcd (8, 9, 4, 5, 6, 7);         // Пины экрана
iarduino_RTC clock(RTC_DS1302, 2, 4, 3);      // Пины подключения модуля часов (RST, Clock, Data)
MicroDS18B20 <A1> sensor;                     // Указание пина подключения сенсора влаги
int txt_1 = 0;                                // Счётчик вывода текста "-<*GREENHOUSE*>-" и времени
int txt_2 = 0;                                // Счётчик вывода меню или температуры и влажности
int buttons = 500;                            // Счётчик нажатия кнопок
int btn_sel = 0;

uint32_t timer1;                              // Переменная таймера 1 (Яркость экрана)
uint32_t timer2;                              // Переменная таймера 2 (Обновление экрана)
// uint32_t timer3;
byte wvalue;                                  // Переменная влажности
byte gradus[8] = {B01100, B10010, B10010,     // Символ градуса
                  B01100, B00000, B00000,
                  B00000, B00000};            

//-------------------------------FOR MENU-----------------------------------

//---------------------------------------------------------------------------------------------------------------------------
void setup()
{
  lcd.clear();                                // Очистка экрана
  analogWrite(10, 255);                       // Установить максимальную яркость подсветки 
  lcd.begin(16, 2);                           // Инициализируем LCD 16x2  
  lcd.createChar(0, gradus);                  // Переменная градусов
  clock.begin();                              // Начало работы с модулем часов
//-----------------------(Только после замены контроллера или батарейки!!!)--------------------------------------------------
  Serial.begin(9600);                       // Открытие порта всязи с компьютером
  delay(300);                                 // Ожидание инициализации модуля часов
//  clock.settime (00, 43, 03, 12, 5, 23);    // Запись первоначального значения времени (Секунды, Минуты, Часы, Месяц, Год)
                                              // Последовательность имеет значение!
}
//--------------------------------------ОСНОВНОЙ ЦИКЛ------------------------------------------------------------------------
void loop()
{
//------------------------------------------ЧАСЫ-----------------------------------------------------------------------------
      clk();
//---------------------------ЧТЕНИЕ ТЕМПЕРАТУРЫ, ВЛАЖНОСТИ И ВЫВОД-----------------------------------------------------------
  if (buttons >= 400)
      scrn();
//---------------------------------------RIGHT BUTTON----------------------------------------------------------------------
  if (analogRead (A0) < 100)                  // Если значение кнопки меньше 100 -> "Right Button"
     btn_right();
//----------------------------------------UP BUTTON------------------------------------------------------------------------
   else if (analogRead (A0) < 200)            // Если значение кнопки меньше 200 -> "Up Button"
       btn_up();
//----------------------------------------DOWN BUTTON----------------------------------------------------------------------
   else if (analogRead (A0) < 400)            // Если значение кнопки меньше 400 -> "Down Button"
       btn_down();
 //---------------------------------------LEFT BUTTON----------------------------------------------------------------------
   else if (analogRead (A0) < 600)            // Если значение кнопки меньше 600 -> "Left Button"
       btn_left();
 //--------------------------------------SELECT  BUTTON--------------------------------------------------------------------
   else if (analogRead (A0) < 800)            // Если значение кнопки меньше 800 -> "Select Button"
       btn_select();
 --------------------------------------------------------------------------------------------------------------------------
    buttons = (buttons + 1);                   // Увеличение значения счётчика кнопок
//----------------------------------УМЕНЬШЕНИЕ ПОДСВЕТКИ ЭКРАНА------------------------------------------------------------
   if (millis() - timer1 >= PERIOD1)          // ищем разницу
    {
      timer1 = millis();                      // сброс таймера
      analogWrite(10, 5);                     // Установить минимальную яркость подсветки
    }

//Serial.println(btn_sel);
}
//---------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------ПОДПРОГРАММЫ----------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------
void scrn()
    {
      sensor.requestTemp();
      lcd.setCursor(0,1);                                           // Установить курсор на вторую строку
      lcd.print ("t");
      lcd.write((byte)(0)); lcd.print ("C");
      lcd.print(char(126));  
      lcd.print (sensor.getTemp());                                 // Вывод температуры
      lcd.setCursor(8,1);
      lcd.print ("  w"); lcd.print(char(126));
      wvalue = map(analogRead(A2), 370, 1020, 100, 0);              // Чтение влажности
    
      if (millis() - timer2 >= PERIOD2)                                 // Задержка обновления экрана
         {
          lcd.setCursor(12,1); lcd.print (wvalue); lcd.print ("% ");    // Вывод влажности
          timer2 = millis();                                            // сброс таймера
         }
     }
//---------------------------------------------------------------------------------------------------------------------------
void clk()
  {
    if (txt_1 <= 400)                             
    {
      lcd.setCursor(0,0);
      lcd.print ("-<*GREENHOUSE*>-");
      txt_1 = (txt_1 + 1);
    }
   else
    {
      lcd.setCursor(0,0);                          // Установить курсор (Первая строка, нулевой символ)
      lcd.print ("TIME: ");
      lcd.print(clock.gettime("H:i D"));           // Выводятся только часы, минуты, день. Остальное не нужно.
      lcd.print ("     ");
      txt_2 = (txt_2 + 1);
    }
   if (txt_2 >= 600)                             
    {
      txt_1 = 0;
      txt_2 = 0;
    }
  }
//---------------------------------------------------------------------------------------------------------------------------
void btn_up()                                 // Кнопка "В верх"
  {
      analogWrite(10, 255);                   // Установить максимальную яркость подсветки 
      lcd.setCursor(0,1);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("Up Button         ");       // Вывести текст
      buttons = 0;                            // Сброс счётчика кнопок
//      timer1 = millis();                      // сброс таймера
  }
//---------------------------------------------------------------------------------------------------------------------------
void btn_right()                              // Кнопка "Право"
  {
      analogWrite(10, 255);                   // Установить максимальную яркость подсветки
      lcd.setCursor(0,1);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("Right Button    ");         // Вывести текст
      buttons = 0;                            // Сброс счётчика кнопок
//      timer1 = millis();                      // сброс таймера
  }
//---------------------------------------------------------------------------------------------------------------------------
void btn_left()                               // Кнопка "Лево"
  {
      analogWrite(10, 255);                   // Установить максимальную яркость подсветки
      lcd.setCursor(0,1);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("Left Button     ");         // Вывести текст
      buttons = 0;                            // Сброс счётчика кнопок
//      timer1 = millis();                      // сброс таймера
  }
//---------------------------------------------------------------------------------------------------------------------------
void btn_down()                               // Кнопка "Вниз"
  {
      analogWrite(10, 255);                   // Установить максимальную яркость подсветки
      lcd.setCursor(0,1);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("Down Button     ");         // Вывести текст
      buttons = 0;                            // Сброс счётчика кнопок
//      timer1 = millis();                      // сброс таймера
  }
//---------------------------------------------------------------------------------------------------------------------------
void btn_select()                             // Кнопка "Выбор"
  {
      analogWrite(10, 255);                   // Установить максимальную яркость подсветки
      lcd.clear();
      lcd.setCursor(6,0);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("MENU");         // Вывести текст
      lcd.setCursor(6,1);                     // Установить курсор на вторую строку в нулевую позицию
      lcd.print ("TEST");         // Вывести текст
//      for (int btn_sel = 0; btn_sel <= 1000; btn_sel++)
       

//       Serial.println(btn_sel);

          if (analogRead (A0) < 800)
          {
            delay(500);
            return;
          }
        

  }
//---------------------------------------------------------------------------------------------------------------------------

Спасибо за правильно выложенный код
И что тут не работает?

@MorAlex , Вы в курсе, что (val >= 700 && val <= 800) и (analogRead (A0) > 700 && analogRead (A0) <= 800) это совершенно разные по смыслу конструкции?
Чтобы они стали похожими, следует написать:

int val = analogRead(A0);
if(val >= 700 && val <= 800)...

Иначе у Вас 700 сравнивается с одним числом (полученным функцией analogRead), а 800 - совсем с другим (полученным вторым обращением к analogRead, которое в общем случае выдаст уже другой результат).
Я даже не говорю о том, что второй вариант будет выполняться вдвое дольше первого, т.к. analogRead - очень медленная функция, она выполняется около 1800 тактов.

3 лайка

Я пытаюсь создать меню на Arduino для двухстрочного дисплея с Keypad, но знаний не хватает. Там кнопки подключены через резисторы через один аналоговый порт к Arduino. При нажатии у каждой кнопки диапазон значений разный при чтении.
С этим вроде как разобрался, но возникла другая проблема. На Arduino IDE всё прекрасно компилируется и работает, но если тоже самое открыть в Visual Code, то начальные данные в часы (RTC) не записываются. В Arduino IDE всё нормально. Как так? Библиотека одна и та же. Ошибок нет.

VS Code - взрослая среда, в отличие от. И в отличие от вольностей не любит. Потому там нужно писать сразу правильно

Ответ не очень информативен. Получается, что библиотека для RTC модуля написана не правильно и там не работает? Так я думаю её не школьник писал.

Т.е. предположить, что проблема не в библиотеке, а в вашем коде - не получается?
Про неинформативность - ну извините, без кода предметно рассуждать не получается

1 лайк

Огромное спасибо за подсказку!

Кстати, да. Ни разу не сталкивался, чтобы VSC как то по особенному компилировал код. Даже знаю, почему так происходит. Тут явно что-то в консерватории нужно подправить

Он по особенному и не компилирует. Это Ардуино IDE за пользователем некоторые вольности сама исправляет, VS Code такой хренью не страдает ))

Что может быть не правильно?
Вот код:

#include <LiquidCrystal.h> // Библиотека управления дисплеем
#include <microDS18B20.h> // Библиотека чтения температуры
#include <iarduino_RTC.h> // Библиотека работы с модулем часов
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); // Пины экрана
iarduino_RTC clock(RTC_DS1302, 2, 4, 3); // Пины подключения модуля часов (RST, Clock, Data)
MicroDS18B20 sensor;

void setup()
{
lcd.clear(); // Очистка экрана
analogWrite(10, 255); // Установить максимальную яркость подсветки
lcd.begin(16, 2); // Инициализация LCD 16x2
clock.begin(); // Начало работы с модулем часов
delay(300); // Ожидание инициализации модуля часов
// |Сек|Мин|Час|День|Мес|Год)
clock.settime (00, 04, 02, 12, 6, 23); // Запись первоначального значения времени

// Serial.begin(9600);
}

Проще некуда. В Arduino IDE всё прекрасно работает и в модуль часов данные записывает, а вот в VS Code данные времени не записываются. Почему?

И с ходу указываем направление - в сад. Что вы не умеете вставлять код правильно, я не поверю, значит вы сделали так сознательно. А значит - в сад

На форумах обычно идут обсуждения проблем, задают вопросы или ищут помощи. Но на любом форуме, есть индивиды которые гнут пальцы или пишут ради того, что-бы написать.
Вы хотите что бы я вообще весь код написал? А смысл?

Это заблуждение. Достаточно прочитать правила этого форума.

Действительно, какой смысл смотреть писанину человека, который откровенно проявляет неуважение к собеседникам, вываливая код в тексте без форматирования и нумерации строк? Верно, никакого. Так что в сад

1 лайк