Arduino
Two Wire Arduino Knight Rider Circuit and Sketch Using PCF8574 I/O expander IC
Arduinoから2ピンで複数のLED操作をする回路が参考になる。
Tutorial 18: Two Wire Arduino Knight Rider Circuit and Sketch Using PCF8574 I/O expander IC
Connect eight LEDs to an Arduino and make a Knight Rider display using only two Arduino pins in this tutorial. This is made possible by using a PCF8574 I/O expander IC.
Arduino Clock Circuit and Sketch using PCF8563 Real Time Clock (RTC)
水晶振動子や電池バックアップの回路が参考になる。
Tutorial 16: Arduino Clock Circuit and Sketch using PCF8563 Real Time Clock (RTC)
The Arduino displays the time and date on a LCD (optional) and in the Arduino IDE serial monitor window in this tutorial. A PCF8563 real time clock (RTC) IC is used to generate the time and date.
割り込み処理
- LOW:LOWの間は何回でも発火
- CHANGE:LOW→HIGH と HIGH→LOW の変化時に発火
- RISING:LOW→HIGH の変化時に発火
- FALLING:HIGH→LOW の変化時に発火
- HIGH:HIGHの間は何回でも発火(UNOでは使用不可)
#include <TM1637Display.h> // 4-Dig LED Disp
#define FOURDIG_LED_CLK 4 // 7セグ4桁LEDはD4ピンに挿す
#define FOURDIG_LED_DAT 5
#define LED 8 // LEDはD8ピンに挿す
#define BUTTON 2 // ボタンはD2ピンに挿す
TM1637Display led4d(FOURDIG_LED_CLK, FOURDIG_LED_DAT);
int mode = 0; // 0=消灯モード、1=点滅モード
int count = 0; // ボタンを押した回数
void warikomi()
{
led4d.showNumberDec(++count, false, 4, 0);
if (mode) {
mode = 0;
} else {
mode = 1;
}
}
void setup() {
led4d.setBrightness(0x0a);
led4d.showNumberDec(count, false, 4, 0);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON), warikomi, RISING ); // 0=D2、1=D3
}
void loop() {
if (mode) {
// LED点滅
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
} else {
// LED消灯
digitalWrite(LED, LOW);
}
}
時計(時報あり)
#include <TM1637Display.h> // 4-Dig LED Disp
#include <Wire.h>
#include "RTClib.h"
#define BUZZER 7
#define BUTTON 8
#define FOURDIG_LED_CLK 2
#define FOURDIG_LED_DAT 3
RTC_DS1307 rtc;
TM1637Display led4d(FOURDIG_LED_CLK, FOURDIG_LED_DAT);
int last = 0;
bool isLedPower = true;
uint8_t dataLed[] = { 0,0,0,0 };
void beep1() {
digitalWrite(BUZZER, HIGH);
delayMicroseconds(1);
digitalWrite(BUZZER, LOW);
}
void beep2() {
digitalWrite(BUZZER, HIGH);
delay(10);
digitalWrite(BUZZER, LOW);
}
void beep3() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER, HIGH);
delay(3);
digitalWrite(BUZZER, LOW);
delay(80);
}
}
void beep4(int kai) {
for (int i = 0; i < kai; i++) {
digitalWrite(BUZZER, HIGH);
delay(10);
digitalWrite(BUZZER, LOW);
delay(200);
}
}
void setup() {
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
pinMode(BUTTON, INPUT);
pinMode(BUZZER, OUTPUT);
led4d.setBrightness(0x0a);
beep3();
}
void loop() {
if (! rtc.isrunning()) {
led4d.showNumberDec(8888, false, 4, 0);
beep2();
delay(1000);
return;
}
DateTime now = rtc.now();
if (digitalRead(BUTTON)) {
beep2();
if (isLedPower) {
for(int i=0; i<4; i++)
dataLed[i] = 0;
led4d.setSegments(dataLed);
isLedPower = false;
} else {
isLedPower = true;
}
delay(500);
}
int nhour = now.hour();
int nmin = now.minute();
int counter = nhour * 100 + nmin;
int nsec = now.second();
if (last != nsec) {
if(nsec == 0) {
if(nmin == 0) {
int kai = nhour % 6;
if(kai == 0)
kai = 6;
beep4(kai);
}
}
last = nsec;
beep1();
if (isLedPower) {
int num = counter;
dataLed[3] = led4d.encodeDigit(num % 10);
if (num > 10)
dataLed[2] = led4d.encodeDigit((num / 10) % 10);
if (num > 100)
dataLed[1] = led4d.encodeDigit((num / 100) % 10);
if (num > 1000)
dataLed[0] = led4d.encodeDigit((num / 1000) % 10);
else
dataLed[0] = led4d.encodeDigit(0);
if ((nsec % 2) == 0)
dataLed[1] ^= 0b10000000;
led4d.setSegments(dataLed);
}
}
delay(50);
}
PlatformIO IDE
Arduinoの開発ツール
An open source ecosystem for IoT development · PlatformIO