割り込み処理
- 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
労働者監視プログラム
使用パーツ
- LED
- LCD RGB Backlight
- Buzzer
- RIP Motion Sensor
- Speaker
#include "rgb_lcd.h"
#define PIR_MOTION_SENSOR 2 // Pin D2
#define LED 4 // Pin D4
#define BUZZER 5 // Pin D5
#define SPEAKER 6 // Pin D6
rgb_lcd lcd;
int counter = 0; // 32bit Max 2147483647
int lastValue = LOW;
char scount[17];
float gLastMtime = 0;
float gLastSound = 0;
int flagAlert = 0;
void kLcdoutDec(int i)
{
sprintf(scount, "%14d", i);
lcd.setCursor(0, 1);
lcd.print(scount);
}
void beep() {
int i;
for (i = 0; i < 1; i++)
{
digitalWrite(BUZZER, HIGH);
delay(4);
digitalWrite(BUZZER, LOW);
delay(1);
}
}
void sound()
{
int idx = 0;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 400; i++)
{
digitalWrite(SPEAKER, LOW);
delayMicroseconds(500 - i);
digitalWrite(SPEAKER, HIGH);
delayMicroseconds(500 - i);
}
delay(200);
}
digitalWrite(SPEAKER, HIGH);
}
void LedOn()
{
digitalWrite(LED, HIGH);
}
void LedOff()
{
digitalWrite(LED, LOW);
}
void setup()
{
pinMode(PIR_MOTION_SENSOR, INPUT);
pinMode(LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(SPEAKER, OUTPUT);
digitalWrite(SPEAKER, HIGH);
lcd.begin(16, 2);
lcd.clear();
lcd.print("Work supervisor ");
lcd.setRGB(0, 128, 0);
beep();
// delay(1000);
// sound();
}
void loop()
{
unsigned long mtime = millis();
int sensorValue = digitalRead(PIR_MOTION_SENSOR);
if (sensorValue == HIGH) {
LedOn();
counter = 0;
flagAlert = 0;
lcd.setRGB(0, 128, 0);
if (lastValue != sensorValue) {
int nondet = (int)((mtime - gLastMtime) / 1000);
if (nondet > 10) {
kLcdoutDec(nondet);
beep();
}
gLastMtime = mtime;
}
}
else {
LedOff();
if(mtime - gLastMtime > 10000) {
flagAlert = 1;
lcd.setRGB(128, 0, 0);
}
if(flagAlert == 1 && ((mtime - gLastSound) > 2300)) {
gLastSound = mtime;
sound();
}
}
lastValue = sensorValue;
if (++counter >= 1000000000)
counter = 0;
}
労働者監視ロボット - YouTube
一定時間、労働者の動きが止まるか、離席をすると警報を発報します。 この動画では10秒間に設定しています。 警報の発報後、動きを検知すると警報を停止し復帰までに要した秒数を表示します... という空想のものです。 将来、このようなロボットが職場に配備されると怖いですね。