В этом эксперименте светодиод должен включаться при падении уровня освещенности ниже порога, заданного потенциометром.
#define LED_PIN 13
#define LDR_PIN A0
#define POT_PIN A1
void setup()
{
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
// считываем уровень освещённости. Кстати, объявлять
// переменную и присваивать ей значение можно разом
int lightness = analogRead(LDR_PIN);
// считываем значение с потенциометра, которым мы регулируем
// пороговое значение между условными темнотой и светом
int threshold = analogRead(POT_PIN);
// объявляем логическую переменную и назначаем ей значение
// «темно ли сейчас». Логические переменные, в отличие от
// целочисленных, могут содержать лишь одно из двух значений:
// истину (англ. true) или ложь (англ. false). Такие значения
// ещё называют булевыми (англ. boolean).
boolean tooDark = (lightness < threshold);
// используем ветвление программы: процессор исполнит один из
// двух блоков кода в зависимости от исполнения условия.
// Если (англ. «if») слишком темно...
if (tooDark) {
// ...включаем освещение
digitalWrite(LED_PIN, HIGH);
} else {
// ...иначе свет не нужен — выключаем его
digitalWrite(LED_PIN, LOW);
}
}
boolean
, которые хранят только значения true
(истина, 1) или false
(ложь, 0). Эти значения являются результатом вычисления логических выражений. В данном примере логическое выражение — это lightness < threshold
. На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness
и threshold
, которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.lightness
меньше значения threshold
, потому что мы использовали оператор <
. Мы можем использовать операторы >
, <=
, >=
, ==
, !=
, которые значат «больше», «меньше или равно», «больше или равно», «равно», «не равно» соответственно.==
и не путайте его с оператором присваивания =
. В первом случае мы сравниваем значения выражений и получаем логическое значение (истина или ложь), а во втором случае присваиваем левому операнду значение правого. Компилятор не знает наших намерений и ошибку не выдаст, а мы можем нечаянно изменить значение какой-нибудь переменной и затем долго разыскивать ошибку.if
(«если») — один из ключевых в большинстве языков программирования. С его помощью мы можем выполнять не только жестко заданную последовательность действий, но принимать решения, по какой ветви алгоритма идти, в зависимости от неких условий.lightness < threshold
есть значение: true
или false
. Мы вычислили его и поместили в булеву переменную tooDark
(«слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»if
всё логическое выражение:if (lightness < threshold) {
// ...
}
if
обязательно следует блок кода, который выполняется в случае истинности логического выражения. Не забывайте про обе фигурные скобки {}
!if (…)
без фигурных скобок:if (lightness < threshold)
digitalWrite(LED_PIN, HIGH);
if
может быть расширен конструкцией else
(«иначе»). Блок кода или единственная инструкция, следующий за ней, будет выполнен только если логическое выражение в if
имеет значение false
, «ложь». Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод».if (условие) {действие;}
. В каких случаях будет выполнено действие
?y
выражение x + y > 0
будет истинным, если x > 0
?if
ложно?==
от оператора =
?if (условие) действие1; else действие2;
, может ли быть ситуация, когда ни одно из действий не выполнится? Почему? tooDark
с сохранением функционала устройства.