Тема 5.3: Интерактивный информационный экран «Метеостанция»

Метеостанция

Придумайте название для своей станции и отобразите поведение станции на экране.
Разберитесь в процессе работы и какие датчики используются.
Например, в зависимости от температуры отображается текущая температура и соответствующее изображение. (Используйте не менее 5 предложений и 5 изображений)
Обмен предложениями и изображениями происходит в зависимости от времени или информации, полученной от датчиков.
Например, для создания изображений полезна такая страница: https://omerk.github.io/lcdchargen/.

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

#include <LiquidCrystal.h>

const int temperaturePin = 0;
const int red = 6;
const int blue = 7;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte armsDown[8] = {0b00100, 0b01010, 0b00100, 0b00100, 0b01110, 0b10101, 0b00100, 0b01010};
byte armsUp[8] = {0b00100, 0b01010, 0b00100, 0b10101, 0b01110, 0b00100, 0b00100, 0b01010};
byte sun[8] = {0b00100, 0b10101, 0b01110, 0b11111, 0b01110, 0b10101, 0b00100, 0b00000};
byte snowflake[8] = {0b00100, 0b01010, 0b00100, 0b10001, 0b11111, 0b00100, 0b01010, 0b00100};

void setup() {
Serial.begin(9600);
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);

lcd.begin(16, 2);

lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
lcd.createChar(5, sun);
lcd.createChar(6, snowflake);
}

void loop() {
float voltage = getVoltage(temperaturePin);
float degreesC = (voltage – 0.5) * 100.0;

Serial.print(“Voltage: “);
Serial.print(voltage);
Serial.print(” deg C: “);
Serial.print(degreesC);

if (degreesC >= 25) {
Serial.println(” – Hot”);
digitalWrite(blue, HIGH);
digitalWrite(red, LOW);

runAnimation(true);

} else {
Serial.println(” – Cold”);
digitalWrite(blue, LOW);
digitalWrite(red, HIGH);

runAnimation(false);

}

delay(3000);
}

float getVoltage(int pin) {
return (analogRead(pin) * 0.004882814);
}

void runAnimation(bool towardsSun) {
if (towardsSun) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(6); // Snowflake
lcd.setCursor(15, 0);
lcd.write(5); // Sun

for (int i = 0; i < 15; i++) {
  lcd.setCursor(i, 1);
  lcd.write(i % 2 == 0 ? 3 : 4); // Running animation
  delay(300);
  lcd.setCursor(i, 1);
  lcd.write(' '); // Clear previous position
  lcd.setCursor(0, 0);
  lcd.write(6); // Snowflake
  lcd.setCursor(15, 0);
  lcd.write(5); // Sun
}

} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(6); // Snowflake
lcd.setCursor(15, 0);
lcd.write(5); // Sun

for (int i = 14; i >= 0; i--) {
  lcd.setCursor(i, 1);
  lcd.write(i % 2 == 0 ? 3 : 4); // Running animation
  delay(300);
  lcd.setCursor(i, 1);
  lcd.write(' '); // Clear previous position
  lcd.setCursor(0, 0);
  lcd.write(6); // Snowflake
  lcd.setCursor(15, 0);
  lcd.write(5); // Sun
}

}
}

https://drive.google.com/file/d/1gIU4Zedcb1xsGTE96KxwDkWX7TGXTrgX/view?usp=sharing