Объединение двух функций

Это мой код 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
}

, 👍0


2 ответа


Лучший ответ:

1

Я думаю, вы просите что-то вроде этого:

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», сообщающим компилятору, что возвращаемое функцией логическое значение было намеренно «аннулировано», т. е. вы намеревались не читать его и не выдавать сообщение об ошибке.

,

3

Такие функции, как

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
   }
}
,