Как работает этот код?
Я нашел этот код ниже, но не могу понять, как он работает. Может ли кто-нибудь объяснить мне ход программы?
#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);
}
}
@Joseph Alvares, 👍2
Обсуждение1 ответ
Я предполагаю, что у вас уже есть некоторое представление о программировании, поэтому я не буду буквально объяснять все по строкам (это, вероятно, выйдет за рамки этого сайта и приведет к очень длинному ответу). Однако я попытаюсь объяснить важные моменты. Если вам нужно найти дополнительную информацию о конкретных командах, я рекомендую ознакомиться со справочником 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);
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
кто проголосовал против этого? Это законный вопрос от нового пользователя., @PhillyNJ