Как я могу заставить условные операторы работать с логическим значением (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 светодиода последовательно на основе кнопочного входа?
- Как включить 3 светодиода в повторяющейся последовательности, чтобы все три светодиода затем выключались при отпускании используемой кнопки?
- Как заставить Arduino реагировать на последовательную информацию?
программа принимает решения на основе значений pot_device и ldr_device, но значения этих двух переменных никогда не меняются., @jsotola