Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Секундомер на OLED-дисплее

Смотрел видео, в котором демонстрировалось устройство с одной кнопкой. С её помощью можно было запускать несколько программ. Среди них была программа "Секундомер". Я решил повторить на своём экране с другими размерами, который лежал у меня под рукой.

Stopwatch

Подключал на макетной плате. Подключение экрана есть в статье. Также добавил обычную кнопку на вывод 7. Код немного поправил.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// software SPI:
#define OLED_MOSI   11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    12
#define OLED_RESET 8

// Новый конструктор с указанием размеров экрана
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
                         OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

const unsigned char PROGMEM clock [] = {
  0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xF8, 0x00,
  0x00, 0x1F, 0xF8, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xE0,
  0x00, 0x1F, 0xF8, 0xF0, 0x00, 0x7F, 0xFE, 0x70, 0x00, 0xFF, 0xFF, 0x20, 0x01, 0xF0, 0x0F, 0x80,
  0x03, 0xC1, 0x83, 0xC0, 0x03, 0x81, 0x81, 0xC0, 0x07, 0x01, 0x80, 0xE0, 0x07, 0x01, 0x80, 0xE0,
  0x0E, 0x01, 0x80, 0x70, 0x0E, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0, 0x70, 0x0E, 0x03, 0xC0, 0x70,
  0x0E, 0x03, 0xC0, 0x70, 0x0E, 0x01, 0x80, 0x70, 0x0E, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xE0,
  0x07, 0x00, 0x00, 0xE0, 0x07, 0x80, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0x80,
  0x00, 0xF8, 0x1F, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00
};

int pushButton = 7;

int second = 0;
int minute = 0;
unsigned long msec = 0;
unsigned long mili = 0;
int pres = 0;
int fase = 0;
int start = 0;
unsigned long tim = 0;

void setup()   {
  Serial.begin(9600);
  pinMode(pushButton, INPUT_PULLUP);
  display.begin(SSD1306_SWITCHCAPVCC);

  display.clearDisplay();
  display.setFont(&FreeSans9pt7b);
  display.setTextColor(WHITE);
  display.setCursor(2, 10);
  display.print("Stopwatch");
  display.display();
  delay(800);
}

void loop()
{
  int buttonState = digitalRead(pushButton);
  Serial.println(buttonState);
  
  display.clearDisplay();
  if (digitalRead(pushButton) == 0)
  {
    if (pres == 0)
    {
      fase = fase + 1;
      pres = 1;
      if (fase > 2)
        fase = 0;
    }
  } else {
    pres = 0;
  }

  if (fase == 0)
  {
    display.setFont();
    display.setCursor(10, 0);
    display.print("Press..");
    display.drawBitmap(14, 12,  clock, 32, 32, 1);

    second = 0;
    minute = 0;
    tim = 0;
    mili = 0;
    msec = 0;
    start = 0;
  }

  if (fase == 1)
  {
    display.clearDisplay();
    display.setFont();
    display.setCursor(2, 0);
    display.print("Stopwatch");
    display.setFont(&FreeSans9pt7b);

    if (start == 0)
    {
      start = 1;
      tim = millis();
    }
    msec = (millis() - tim);

    minute = msec / 60000;

    if ((msec / 1000) > 59)
    {
      second = (msec / 1000) - (minute * 60);
    } else {
      second = msec / 1000;
    }

    mili = (msec % 1000) / 10;

    display.setCursor(0, 24);
    if (minute <= 9)
    {
      display.print("0");
      display.print(minute);
    } else {
      display.print(minute);
    }

    display.print(":");

    if (second <= 9)
    {
      display.print("0");
      display.print(second);
    } else {
      display.print(second);
    }
    display.setFont(&FreeSans12pt7b);
    display.setCursor(0, 47);

    if (mili <= 9)
    {
      display.print("0");
      display.print(mili);
    } else {
      display.print(mili);
    }
  }

  if (fase == 2)
  {
    display.clearDisplay();
    display.setFont();
    display.setCursor(0, 0);
    display.print("time:");
    display.setFont(&FreeSans9pt7b);
    display.setCursor(0, 24);
    if (minute <= 9)
    {
      display.print("0");
      display.print(minute);
    } else {
      display.print(minute);
    }

    display.print(":");

    if (second <= 9)
    {
      display.print("0");
      display.print(second);
    } else {
      display.print(second);
    }
    display.setFont(&FreeSans12pt7b);
    display.setCursor(0, 47);

    if (mili <= 9)
    {
      display.print("0");
      display.print(mili);
    } else {
      display.print(mili);
    }
  }
  display.display();
}

Сразу после запуска секундомер начинает работать. Первое нажатие останавливает секундомер. Второе нажатие подготавливает к следующему запуску. Третье нажатие снова запускает секундомер.

Реклама