Объединение двух функций
Это мой код Arduino, который проверяет уровень воды в двух разных резервуарах с помощью двух датчиков уровня воды A и B:
#define Water_Level_A 5;
#define Water_Level_B 6;
boolean Water_Level_Check_A(){
boolean Result = digitalRead(Water_Level_A);
return Result;
}
boolean Water_Level_Check_B(){
boolean Result = digitalRead(Water_Level_B);
return Result;
}
void setup() {
Serial.begin(9600);
pinMode(Water_Level_A,INPUT);
pinMode(Water_Level_B,INPUT);
}
void loop() {
if (Water_Level_Check_A() == LOW){
--> Water Pump A
}
if Water_Level_Check_B() == LOW{
--> Water Pump B
}
Какой лучший способ упростить этот код, чтобы мне понадобилась только одна функция Water_Level_Check
, чтобы различие между A и B, а также Water_Level_A и Water_Level_B было сделано внутри функции, а часть цикла выглядела так:
void loop() {
if (Water_Level_Check_(A) == LOW){
--> Water Pump A
}
if Water_Level_Check_(B) == LOW{
--> Water Pump B
}
@Peter S, 👍0
2 ответа
Лучший ответ:
Я думаю, вы просите что-то вроде этого:
boolean Water_Level_Check(uint8_t level_pin){
boolean Result = digitalRead(pin);
if( level_pin == Water_Level_A ){
// управляйте насосом A здесь
}
else if( level_pin == Water_Level_B ){
// управляйте насосом B здесь
}
else {
Serial.println("Water_Level_Check: unknown pin number.");
// или какой-либо другой способ решения проблемы с неправильным номером пин-кода.
return -1;
}
return Result;
}
для функции проверки уровня, которая упростит вашу функцию цикла до:
void loop() {
(void)Water_Level_check(Water_Level_A);
(void)Water_Level_check(Water_Level_B);
}
Выражение (void)
перед каждым вызовом является «приведением к типу void», сообщающим компилятору, что возвращаемое функцией логическое значение было намеренно «аннулировано», т. е. вы намеревались не читать его и не выдавать сообщение об ошибке.
Такие функции, как
boolean Water_Level_Check_A(){
boolean Result = digitalRead(Water_Level_A);
return Result;
}
Действительно слишком сложно. Вы просто вызываете одну функцию и возвращаете это значение, поэтому это можно упростить до
boolean Water_Level_Check_A(){
return digitalRead(Water_Level_A);
}
Или просто выражение
digitalRead(Water_Level_A)
когда вам это нужно.
Так что все, что вы делаете, это вызываете digitalRead()
на номере пина и проверяете, является ли результат низким. Если вы действительно хотите переместить это в другую функцию, то вы можете передать ей аргумент номера пина и напрямую инвертировать результат, так что true
из этой функции будет означать, что необходимо выполнить какое-то действие.
boolean Water_Level_Check(int sensorPin){
return !digitalRead(sensorPin);
}
И затем назовите это как
void loop() {
if (Water_Level_Check(Water_Level_A)){
//--> Водяной насос А
}
if (Water_Level_Check(Water_Level_B )){
//--> Водяной насос B
}
}
- Как объявить массив переменного размера (глобально)
- Как повторить кусок кода
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Каковы традиционные способы оптимизации использования программной памяти?
- Как включить максимальное удаление мертвого кода?
- Как увеличить срок службы EEPROM?
- Лучшая практика — объявлять «статичный» текст и экономить память
- Как быстро и без задержки переместить сервопривод?