Перелистывание экранов на LCD 5110

Denchik200401
Offline
Зарегистрирован: 17.07.2016

Здравствуйте! Такой вопрос, есть 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();
}
  

 

Araris
Offline
Зарегистрирован: 09.11.2012

1. Строку 41 лучше заменить на if (lcd==1) lcd=2; else lcd=1;

2. Но это не поможет, попав в функцию Main() Вы никогда не вернётесь назад в loop(), ибо строка 56. Скорость лучше вычислять в loop(), а в Main() и в Score() просто выводить данные на экран.