Перелистывание экранов на LCD 5110
- Войдите на сайт для отправки комментариев
Пт, 22/07/2016 - 15:59
Здравствуйте! Такой вопрос, есть 2 экрана Main и Score. Нужно между ними переключаться по нажатию кнопки.
Набросал вот такой код, но он не работает.
#include <DS1302.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
DS1302 rtc(9, 10, 11); // (RST, DAT, CLK)
int reedSwitch = 8; // пин, куда присоединен геркон
const int buttonPin = 12;
int cLen = 1.95;// длина обода в метрах
Time t;
byte lcd = 0;
void setup() {
lcd = 1;
// инициализация и очистка дисплея
display.begin();
display.clearDisplay();
display.display();
// rtc.halt(false);
//rtc.writeProtect(false);
//The following lines can be commented out to use the values already stored in the DS1302
//rtc.setDOW(THURSDAY); // Set Day-of-Week to FRIDAY Monday
//rtc.setTime(18, 44, 0);
//rtc.setDate(21, 07, 2016); // Set the date to August 6th, 2010
pinMode(buttonPin, INPUT_PULLUP);
pinMode(reedSwitch, INPUT_PULLUP); // режим входа с подтяжкой к плюсу
Serial.begin(9600); // включаем вывод в последовательный порт
}
void loop() {
t = rtc.getTime();
if (digitalRead(buttonPin) == HIGH) {
lcd = 2;
}
if (lcd ==1)
{
Main();
}
else if (lcd ==2)
{
Score();
}
}
void Main(){
while (digitalRead(reedSwitch) == HIGH); // ждем, пок геркон не будет замкнут
uint32_t Time1 = millis(); // запоминаем время
for (;;) { // крутим "вечный" цикл
delay(50); // ждем, пока магнит проедет мимо геркона
while (digitalRead(reedSwitch) == HIGH); // опять ждем замыкания
uint32_t Time2 = millis(); // берем текущее время
float rTime = (Time2 - Time1) / 3600000.0; // находим время полного оборота колеса в долях часа
float bikeSpeed = (cLen / 1000) / rTime; // вычисляем скорость в км/ч
//Serial.print("Speed: ");
//erial.print(bikeSpeed);
//Serial.println(" km/h.");
display.setContrast(50);
display.clearDisplay();// установка контраста
delay(1000);
display.setTextSize(2); // установка размера шрифта
display.setTextColor(BLACK); // установка цвета текста
display.setCursor(0,1); // установка цвета текста
display.print(bikeSpeed);
display.display();
display.setTextSize(0.5);
display.setCursor(59,15); // установка цвета текста
display.print("Km/h");
display.display();
display.setTextSize(0.5);
display.setCursor(1,25); // установка цвета текста
display.print(rtc.getDOWStr());
display.display();
display.setTextSize(1);
display.setCursor(1,40); // установка цвета текста
display.print(rtc.getTimeStr());
display.display();
Time1 = Time2; // запоминаем время для след. вычисления
}
}
void Score() {
display.setTextSize(0.5);
display.setCursor(59,15); // установка цвета текста
display.print("K");
display.display();
}
1. Строку 41 лучше заменить на if (lcd==1) lcd=2; else lcd=1;
2. Но это не поможет, попав в функцию Main() Вы никогда не вернётесь назад в loop(), ибо строка 56. Скорость лучше вычислять в loop(), а в Main() и в Score() просто выводить данные на экран.