東京太郎😊
夢なき者に成功なし
テストを兼ねて、雑多な情報を発信しています。
ハワイ島・オアフ島と北カリフォルニア・サンフランシスコ周辺には多少詳しいと思います。ITに関しても多少は詳しい筈です。
1459156180

割り込み処理

  • 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);
  }
}
1458980082

時計(時報あり)

#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);
}
1458778549

PlatformIO IDE

Arduinoの開発ツール
An open source ecosystem for IoT development · PlatformIO
1458778369

Arduinoリファレンス

関数やライブラリの参照に便利
1458776824

労働者監視プログラム

使用パーツ

  1. LED
  2. LCD RGB Backlight
  3. Buzzer
  4. RIP Motion Sensor
  5. 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秒間に設定しています。 警報の発報後、動きを検知すると警報を停止し復帰までに要した秒数を表示します... という空想のものです。 将来、このようなロボットが職場に配備されると怖いですね。