Как я могу заставить условные операторы работать с логическим значением (true/false), чтобы включать и выключать синие светодиоды
Я работаю над проектом по созданию монитора растений с Arduino, который улавливает значения света и воды из окружающей среды, и я столкнулся с препятствие в коде. Вот код полностью.
//** **/
инт ЛДР = А4;
инт ПОТ = А3;
интервал зеленый_светодиод = 10;
интервал red_LED = 12;
интервал желтый_светодиод = 11;
интервал blue_LED = 9;
интервал лдрвалуе;
инт значение горшка;
интервал light_threshold = 650;
интервал воды_порог = 850;
Строка dark_message = " ПРЕДУПРЕЖДЕНИЕ: Растение темное!";
Строка Bright_message = " Яркость достигнута! ";
Строка water_message1 = " Растению достаточно воды».
Строка water_message2 = " Нужна вода...!";
Stringhealth_message = "Растение здоровое!";
String engineeringinfo = "Марио Рончи 10.22.22";
bool pot_device = potValue > вода_порог;
bool ldr_device = ldrValue < свет_порог;
недействительная установка () {
pinMode (LDR, ВХОД);
pinMode(POT, INPUT);
pinMode(12, ВЫХОД);
pinMode(10, ВЫХОД);
pinMode(11, ВЫХОД);
pinMode(9, ВЫВОД);
Серийный.начать(9600);
Serial.println(информация об инженере);
}
void ldrCheck (int device, int led_1, int duration1, int led_2, int duration2) {
ldrValue = AnalogRead (устройство);
если (ldrValue >= light_threshold)
{
Serial.print (ldrValue);
Serial.println(яркое_сообщение);
цифровая запись (led_1, ВЫСОКИЙ);
цифровая запись (led_2, НИЗКИЙ);
задержка (длительность1);
}
если (ldrValue < light_threshold){
Serial.print (ldrValue);
Serial.println (темное_сообщение);
цифровая запись (led_2, ВЫСОКИЙ);
цифровая запись (led_1, НИЗКИЙ);
задержка (продолжительность2);
}
}
void potCheck (int device2, int led_3, int led_4, int duration3) {
potValue = аналоговое чтение (устройство2);
если (potValue > water_threshold)
{
Serial.print(potValue);
Serial.println(water_message1);
цифровая запись (led_3, ВЫСОКИЙ);
задержка (продолжительность3);
цифровая запись (led_3, НИЗКИЙ);
задержка (продолжительность3);
}
еще{
Serial.println(water_message2);
}
}
недействительный цикл () {
ldrCheck(LDR, green_LED, 2000, red_LED, 2000);
potCheck(POT, yellow_LED, yellow_LED, 800);
если (pot_device == true и ldr_device == true){
цифровая запись (синий_светодиод, ВЫСОКАЯ);
Serial.println (здоровое_сообщение);
задержка (2000 г.);
}
еще{
цифровая запись (синий_светодиод, ВЫСОКАЯ);
delay(500);
цифровая запись (синий_светодиод, НИЗКИЙ);
delay(500);
}
}
– В чем конкретно вам нужна помощь?
Я работаю над последним фрагментом кода для монитора растений: предполагается, что этот код заставит синий светодиод включаться, когда и POT, и LDR при выполнении определенных условий истинны или ложны.
– Что вы пробовали?
Я пробовал вызывать логическую переменную, делая ее равной условному оператору «и», пробовал переключаться между «и» и «или», но все равно ничего, она либо мигает все время, либо все время горит.
Затем, наконец, я разделил условия на 2 логические переменные, но все равно это не сработало, светодиод мигает, но не получает логическое значение, истинное или ложное, поэтому даже когда я изменяю одно допустимое значение, поведение светодиода не изменяется. изменить.
Затем я проверил условия, посветив фонариком на светодиод и повернув потенциометр на приемлемые значения, опять же, ничего не изменилось
– Что вы пытаетесь сделать?
Я пытаюсь заставить логические переменные работать с условиями, чтобы, когда и LDR, и POT получали приемлемые значения для света и увлажнения, они включали синий светодиод (полностью), а когда уровни освещения и увлажнения падают ниже допустимых значений синий светодиод должен мигать и выключаться.
Приемлемые значения были определены с помощью операторов больше или меньше и помещены в логические переменные, поэтому я могу установить для них значение true или false и активировать светодиод, когда определенные условия истинны или ложны.
– Как вы думаете, в чем проблема?
Я думаю, что первое утверждение противоречит второму утверждению, и синий светодиод просто остается включенным, даже когда я изменяю значения освещенности или увлажнения на менее приемлемые, синий светодиод остается включенным, хотя на самом деле он должен мигать. Он не делает этого. Или наоборот и мигает вечно (циклы)
Спасибо за любые отзывы, так как я все еще учусь программировать на Arduino.
@Mario Ronci, 👍0
Обсуждение1 ответ
Попробую еще раз..
Ваши утверждения:
bool pot_device = potValue > water_threshold;
bool ldr_device = ldrValue < light_threshold;
выполняются только один раз, поэтому значения не изменятся, как отметил @jsotola, так что это не работает.
Что касается мерцания, а не обмена сообщениями, я предлагаю вам создать две новые глобальные переменные, needwater и Needlight. Установите эти значения на 1/0 в функциях potcheck и ldrcheck, соответственно, в зависимости от того, превышают ли они пороговые значения (устанавливают на 1, когда растение нуждается) или ниже (устанавливают на 0, когда растение не нуждается).
Затем ваш контур может оценить эти условия и включить синий индикатор.
void loop() {
ldrCheck(LDR, green_LED , 2000, red_LED, 2000);
potCheck(POT, yellow_LED, yellow_LED, 800);
if ( (needwater == 0) && (needlight == 0) ) {
digitalWrite(blue_LED, HIGH);
//Serial.println(healthy_message);
//delay(2000);
}
else {
if(digitalRead(blue_LED)==HIGH){
digitalWrite(blue_LED,LOW);
}
else{
digitalWrite(blue_LED, HIGH);
}
}
delay(500);
}
Извините за путаницу.
У вас не совсем правильный синтаксис - используйте круглые скобки вокруг каждой оценки
if ( (LD value is acceptable) && (POT value is acceptable) )
Поищите ссылки на / & /&& / и /, чтобы убедиться, что вы их понимаете.
Вы должны придумать лучший способ мигания светодиодов — вы просто не можете мигать и делать задержку для каждого из них. Подумайте об установке глобальных переменных в функциях, а затем посмотрите на эти переменные в цикле()
Что-то вроде...
if (BlueBlink == 1) {
if (blueled == 1) {
blueled = 0;
}
else {
blueled = 1;
}
}
else {
blueled = 1; // if BlueBlink=0 make sure the blue led is on
}
Проделайте это для других светодиодов в ваших функциях, но пусть функции задают глобальную переменную и выполняют переключение в цикле().
В конце цикла () поместите одну короткую задержку, чтобы он часто проверял состояние и мигал при необходимости.
Обмен сообщениями немного сложнее, и вам может потребоваться установить глобальные переменные, которые вы можете отслеживать в цикле, чтобы все сообщения отправлялись в цикле () и только при изменении статуса, иначе у вас будет много повторяющихся сообщений. .
Надеюсь, что-то из этого имеет смысл :)
Спасибо за отзыв, я не понимаю 1 и 0 для истинного или ложного, это то, что вы используете для обозначения истинного или ложного на основе допустимых значений, @Mario Ronci
@MarioRonci: языки C и C++ считают ноль ложным, а любое ненулевое значение истинным. Утверждение вроде if(pot_device == true) полностью эквивалентно if(pot_device != 0) или даже if(pot_device). Любой из этих трех даст точно такой же результат., @JRobert
Мне так хотелось пропустить подробное мигание и использовать одну строку digitalWrite(blue_LED, !digitalRead(blue_LED)); или цифровое чтение (синий_светодиод)? цифровая запись (синий_светодиод, низкий уровень): цифровая запись (синий_светодиод, высокий уровень); Я ужасный человек? :), @DrG
- Реализовать связь Visible Light с помощью Arduino
- 4-битный счетчик вверх и вниз
- Объявленная переменная внутри void setup не видится в void loop
- Скетч мигания ESP8266 не мигает светодиодом
- Акцептант векселей ИКТ
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
- Можно ли смоделировать часы без подключенного RTC?
- Как включить 3 светодиода в повторяющейся последовательности, чтобы все три светодиода затем выключались при отпускании используемой кнопки?
программа принимает решения на основе значений pot_device и ldr_device, но значения этих двух переменных никогда не меняются., @jsotola