Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Смотрел видео, в котором демонстрировалось устройство с одной кнопкой. С её помощью можно было запускать несколько программ. Среди них была программа "Секундомер". Я решил повторить на своём экране с другими размерами, который лежал у меня под рукой.
Подключал на макетной плате. Подключение экрана есть в статье. Также добавил обычную кнопку на вывод 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();
}
Сразу после запуска секундомер начинает работать. Первое нажатие останавливает секундомер. Второе нажатие подготавливает к следующему запуску. Третье нажатие снова запускает секундомер.