Как я могу заставить условные операторы работать с логическим значением (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.

, 👍0

Обсуждение

программа принимает решения на основе значений pot_device и ldr_device, но значения этих двух переменных никогда не меняются., @jsotola


1 ответ


0

Попробую еще раз..

Ваши утверждения:

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