Не могу понять как сделать условие в диапазоне «от» и «до».
Речь о 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 тактов.
Я пытаюсь создать меню на Arduino для двухстрочного дисплея с Keypad, но знаний не хватает. Там кнопки подключены через резисторы через один аналоговый порт к Arduino. При нажатии у каждой кнопки диапазон значений разный при чтении.
С этим вроде как разобрался, но возникла другая проблема. На Arduino IDE всё прекрасно компилируется и работает, но если тоже самое открыть в Visual Code, то начальные данные в часы (RTC) не записываются. В Arduino IDE всё нормально. Как так? Библиотека одна и та же. Ошибок нет.
VS Code - взрослая среда, в отличие от. И в отличие от вольностей не любит. Потому там нужно писать сразу правильно
Ответ не очень информативен. Получается, что библиотека для RTC модуля написана не правильно и там не работает? Так я думаю её не школьник писал.
Т.е. предположить, что проблема не в библиотеке, а в вашем коде - не получается?
Про неинформативность - ну извините, без кода предметно рассуждать не получается
Огромное спасибо за подсказку!
Кстати, да. Ни разу не сталкивался, чтобы 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 данные времени не записываются. Почему?
И с ходу указываем направление - в сад. Что вы не умеете вставлять код правильно, я не поверю, значит вы сделали так сознательно. А значит - в сад
На форумах обычно идут обсуждения проблем, задают вопросы или ищут помощи. Но на любом форуме, есть индивиды которые гнут пальцы или пишут ради того, что-бы написать.
Вы хотите что бы я вообще весь код написал? А смысл?
Это заблуждение. Достаточно прочитать правила этого форума.
Действительно, какой смысл смотреть писанину человека, который откровенно проявляет неуважение к собеседникам, вываливая код в тексте без форматирования и нумерации строк? Верно, никакого. Так что в сад