Как работает этот код?

Я нашел этот код ниже, но не могу понять, как он работает. Может ли кто-нибудь объяснить мне ход программы?

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 10, 7, 5, 4);
int mem=0;
void setup() {
    pinMode (12,OUTPUT);
    pinMode(13,OUTPUT);
    // initialize the LED pin as an output:

    // initialize serial communications:
    Serial.begin(9600);
    lcd.begin(16, 2);
}

void loop() {

    lcd.setCursor(12,1);
    int se25 = analogRead(A4);  
    int se50 = analogRead(A3); 
    int se75 = analogRead(A5);
    int se100 = analogRead(A2);  
    if(se100>=1000){lcd.print("100%   ");mem=100; }  
    else if(se75>=1000){lcd.print("75%   ");mem=75; } 
    else if(se50>=1000){lcd.print("50%   ");mem=50; }
    else if(se25>=1000){lcd.print("25%  ");mem=25; }
    else{lcd.print("emty");mem=0;}
    if(se100<1000&&se75<1000&&se50<1000&&se25<1000){
        digitalWrite(13,LOW);
        lcd.setCursor(12,1);
        lcd.print("emty");
    }

    if(digitalRead(6)==HIGH){digitalWrite(13,LOW);}

    if(digitalRead(6)==LOW&&mem>0) 
    {// read the value of the potentiometer:
        int tempw = 0;
        //digitalWrite(12,LOW);
        int tempa = analogRead(A1);
        delay(20); 
        int tempb = analogRead(A1);
        delay(20); 
        int tempc = analogRead(A1);
        delay(20); 
        int tempd = analogRead(A1);
        delay(20); 
        int tempe = analogRead(A1);
        delay(20); 
        int tempf = analogRead(A1);
        delay(20); 

        int avg = ((tempa + tempb + tempc + tempd + tempe + tempf ) / 6);

        int temp = avg;  
        // map it to the range of the analog out:
        temp = map(temp, 0, 1023, 0, 4900); 
        float tempx = temp * (0.1); 
        // change the analog out value:
        int tempy=analogRead(A0);
        tempy = map(tempy, 0, 1023, 0, 150);
        // print the results to the serial monitor:
        lcd.setCursor(0,0);
        lcd.print("act T=" ); 
        lcd.print(tempx);
        lcd.print("'C  " );
        lcd.setCursor(0,1);
        lcd.print("set T=");  

        lcd.print(tempy);  
        // Serial.println("'C ");
        lcd.print("'C  "); 

        if(tempy<=tempx){digitalWrite(13,LOW);}
        if(tempy>tempx){digitalWrite(13,HIGH);}

        delay(200);
    }

}

, 👍2

Обсуждение

кто проголосовал против этого? Это законный вопрос от нового пользователя., @PhillyNJ


1 ответ


11

Я предполагаю, что у вас уже есть некоторое представление о программировании, поэтому я не буду буквально объяснять все по строкам (это, вероятно, выйдет за рамки этого сайта и приведет к очень длинному ответу). Однако я попытаюсь объяснить важные моменты. Если вам нужно найти дополнительную информацию о конкретных командах, я рекомендую ознакомиться со справочником Arduino.

На очень широком уровне программа снимает некоторые показания и выводит данные на экран (ЖК-дисплей). Я бы предположил, что данные-это уровень жидкости в баке, а также какие-то показания температуры. Однако в этом невозможно быть уверенным, так как я не знаю, что на самом деле подключено к входам.

Эта строка создает объект для общения с ЖК-экраном. Цифры указывают, к каким контактам он подключен:

LiquidCrystal lcd(2, 3, 10, 7, 5, 4);

Функция setup() запускается один раз при запуске устройства и обычно используется для задач инициализации. В этом случае строки в setup() инициализируют два вывода в качестве выходов (#12 и #13), инициализируют последовательную связь (которая на самом деле не используется) и инициализируют ЖК-объект/экран:

pinMode (12,OUTPUT);
pinMode(13,OUTPUT);
...
Serial.begin(9600);
lcd.begin(16, 2);

Остальная часть программы находится в функции loop (), которая выполняется повторно, пока устройство включено.

Следующие строки принимают 4 аналого-цифровых показания (с разных входов) и выводят приблизительный результат:

int se25 = analogRead(A4);  
int se50 = analogRead(A3); 
int se75 = analogRead(A5);
int se100 = analogRead(A2);  
if(se100>=1000){lcd.print("100%   ");mem=100; }  
else if(se75>=1000){lcd.print("75%   ");mem=75; } 
else if(se50>=1000){lcd.print("50%   ");mem=50; }
else if(se25>=1000){lcd.print("25%  ");mem=25; }
else{lcd.print("emty");mem=0;}
if(se100<1000&&se75<1000&&se50<1000&&se25<1000){
    digitalWrite(13,LOW);
    lcd.setCursor(12,1);
    lcd.print("emty");
}

Я предполагаю, что каждое из аналоговых показаний поступает от другого датчика жидкости в резервуаре. Если верхний датчик показывает сильные показания, бак считается полным. В противном случае он проверяет следующий датчик и так далее. Если ни один из них не показывает сильных показаний, резервуар считается пустым. Интересно, что состояние пустого бака на самом деле проверяется дважды, что, по-видимому, является ошибкой.

(Еще раз имейте в виду, что я просто предполагаю, что показания датчиков жидкости в резервуаре. Я не знаю наверняка.)

Оставшаяся часть кода выполняется только в том случае, если определенный ввод (#6) низкий и если резервуар не пуст. Ввод № 6 может быть от какого-то переключателя переопределения, но опять же это всего лишь предположение.

Следующий блок принимает 6 аналоговых показаний, все с одного и того же входа. Между каждым чтением есть небольшая задержка (20 миллисекунд). Затем результаты усредняются. Это распространенный подход, когда вы хотите попытаться устранить всплески шума в аналоговом сигнале.

int tempa = analogRead(A1);
delay(20); 
int tempb = analogRead(A1);
delay(20); 
int tempc = analogRead(A1);
delay(20); 
int tempd = analogRead(A1);
delay(20); 
int tempe = analogRead(A1);
delay(20); 
int tempf = analogRead(A1);
delay(20); 

int avg = ((tempa + tempb + tempc + tempd + tempe + tempf ) / 6);

Следующий блок отображает это значение в другом диапазоне (предположительно, связанном с ожидаемым диапазоном температур). Затем он принимает другое аналоговое считывание с другого входа и переназначает его в другой диапазон:

int temp = avg;  

temp = map(temp, 0, 1023, 0, 4900); 
float tempx = temp * (0.1); 

int tempy=analogRead(A0);
tempy = map(tempy, 0, 1023, 0, 150);

Следующий блок выводит два повторно отображенных показания. Похоже, что оба они рассматриваются как температуры. Один, предположительно, от датчика температуры, а другой, предположительно, от потенциометра, используемого для калибровки системы:

lcd.setCursor(0,0);
lcd.print("act T=" ); 
lcd.print(tempx);
lcd.print("'C  " );
lcd.setCursor(0,1);
lcd.print("set T=");  

lcd.print(tempy);  

lcd.print("'C  "); 

Эти строки сравнивают два показания сверху и устанавливают выходной вывод 13 высоким или низким в зависимости от того, какое значение выше. Я бы предположил, что это может быть связано с сигнальной лампой или чем-то подобным.

if(tempy<=tempx){digitalWrite(13,LOW);}
if(tempy>tempx){digitalWrite(13,HIGH);}

Наконец, эта задержка останавливает слишком быстрое выполнение цикла. Интересно, однако, что код достигает этой точки только при определенных обстоятельствах. В других обстоятельствах нет ограничений на скорость выполнения цикла:

delay(200);
,