忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

ネットワーク時計の製作【ラズパイ、arduino、ESP32】

最近急に7セグメントLEDに興味を持ったのでarduinoかラズパイで何か作れないか考えていた。

ラズパイであればpysonでのプログラミングとなる。pysonはネットワークにつながっていればモジュールをインポートするだけで時間を取得することができる。

とりあえず7セグメントひとつだけでGPIOを制御してみた。
#!/usr/bin/python
# coding: utf-8
# モジュールをインポートする
import time
import RPi.GPIO as GPIO
# GPIO指定をGPIO番号で行う
GPIO.setmode(GPIO.BCM)
num = 0
while num < 2:
  t = time.localtime()
  sec = t[5] #取得した時間のうち5が秒となる。
  print(sec)
  
  if sec == 0:
    GPIO.setup(2, GPIO.OUT)
    GPIO.output(2, 1)
    GPIO.setup(22, GPIO.OUT)
    GPIO.output(22, 1)
    GPIO.setup(3, GPIO.OUT)
    GPIO.output(3, 1)
    GPIO.setup(4, GPIO.OUT)
    GPIO.output(4, 1)
    GPIO.setup(27, GPIO.OUT)
    GPIO.output(27, 1)
    GPIO.setup(17, GPIO.OUT)
    GPIO.output(17, 1)
    
  else:
      GPIO.setup(22, GPIO.OUT)
      GPIO.output(22, 0)
      GPIO.setup(2, GPIO.OUT)
      GPIO.output(2, 0)
      GPIO.setup(3, GPIO.OUT)
      GPIO.output(3, 0) 
      GPIO.setup(4, GPIO.OUT)
      GPIO.output(4, 0)
      GPIO.setup(27, GPIO.OUT)
      GPIO.output(27, 0)
      GPIO.setup(17, GPIO.OUT)
      GPIO.output(17, 0) 
  if sec == 1:
    GPIO.setup(22, GPIO.OUT)
    GPIO.output(22, 1)
    GPIO.setup(3, GPIO.OUT)
    GPIO.output(3, 1)
    
  else:
      GPIO.setup(22, GPIO.OUT)
      GPIO.output(22, 0)
      GPIO.setup(3, GPIO.OUT)
      GPIO.output(3, 0) 
  if sec == 2:
    GPIO.setup(2, GPIO.OUT)
    GPIO.output(2, 1)
    GPIO.setup(22, GPIO.OUT)
    GPIO.output(22, 1)
    GPIO.setup(27, GPIO.OUT)
    GPIO.output(27, 1)
    GPIO.setup(17, GPIO.OUT)
    GPIO.output(17, 1)
    GPIO.setup(14, GPIO.OUT)
    GPIO.output(14, 1)
  else:
      GPIO.setup(22, GPIO.OUT)
      GPIO.output(22, 0)
      GPIO.setup(2, GPIO.OUT)
      GPIO.output(2, 0)
      GPIO.setup(14, GPIO.OUT)
      GPIO.output(14, 0)
      GPIO.setup(27, GPIO.OUT)
      GPIO.output(27, 0)
      GPIO.setup(17, GPIO.OUT)
      GPIO.output(17, 0) 
  if sec == 4:
    GPIO.setup(4, GPIO.OUT)
    GPIO.output(4, 1)
    
  else:
      GPIO.setup(4, GPIO.OUT)
      GPIO.output(4, 0)
  if sec == 5:
    GPIO.setup(17, GPIO.OUT)
    GPIO.output(17, 1)
   
  else:
      GPIO.setup(17, GPIO.OUT)
      GPIO.output(17, 0)
  if sec == 6:
    GPIO.setup(27, GPIO.OUT)
    GPIO.output(27, 1)
  else:
      GPIO.setup(27, GPIO.OUT)
      GPIO.output(27, 0)
  if sec == 7:
    GPIO.setup(14, GPIO.OUT)
    GPIO.output(14, 1)
  else:
      GPIO.setup(14, GPIO.OUT)
      GPIO.output(14, 0)
時間のモジュールをとりこみ、秒を0~9までif文で場合分けし、それぞれGPIOにて出力した。
ラズパイではネットワークにつなぐのが楽なので容易に7セグメントに出力できた。

しかしながら、この調子でケタを増やすとなるとコネクタもコードも煩雑になり困難を極める。

ということで、GPIO出力が多くネットワークにつなげるのが可能なESP32を使うことにした。
arduinoでもほぼ同じコードでできるが、イーサネットシールドが必要になる。
#include <WiFi.h>
#include <time.h>
#define JST     3600* -9
const char* ssid = "SSIDを入れて下さい";
const char* password = "パスワードを入れて下さい";
void setup() {
  
  Serial.begin(115200);
  delay(100);
  Serial.print("\n\nStart\n");
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
   pinMode(13,OUTPUT);
   pinMode(25,OUTPUT);
  pinMode(16,OUTPUT);
   pinMode(17,OUTPUT);
   pinMode(18,OUTPUT);
   pinMode(19,OUTPUT);
    pinMode(22,OUTPUT);
     pinMode(23,OUTPUT);
     pinMode(26,OUTPUT);
     pinMode(27,OUTPUT);
      pinMode(21,OUTPUT);
}
void loop() {
  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  t = time(NULL);
  tm = localtime(&t);
  Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);
//時
        
       if("%02d",tm->tm_hour ==1  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 1
        digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
         ;}
         
        if("%02d",tm->tm_hour ==2  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 2
        digitalWrite(25,HIGH);//右下 2
        digitalWrite(16,LOW);//右上 2
        digitalWrite(22,LOW);//中段 2
        digitalWrite(23,LOW);//上段 2
        digitalWrite(27,LOW);//下段 2
        digitalWrite(26,LOW);//左下 2
        digitalWrite(21,HIGH);//左上 2
        delay(5);
         ;} 
         
          if("%02d",tm->tm_hour ==3  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 3
        digitalWrite(25,LOW);//右下 3
        digitalWrite(16,LOW);//右上 3
        digitalWrite(22,LOW);//中段 3
        digitalWrite(23,LOW);//上段 3
        digitalWrite(27,LOW);//下段 3
        digitalWrite(26,HIGH);//左下 3
        digitalWrite(21,HIGH);//左上 3
        delay(5);
         ;} 
        if("%02d",tm->tm_hour ==4  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 4
        digitalWrite(25,LOW);//右下 4
        digitalWrite(16,LOW);//右上 4
        digitalWrite(22,LOW);//中段 4
        digitalWrite(23,HIGH);//上段 4
        digitalWrite(27,HIGH);//下段 4
        digitalWrite(26,HIGH);//左下 4
        digitalWrite(21,LOW);//左上 4
        delay(5);
         ;} 
         if("%02d",tm->tm_hour ==5  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 5
        digitalWrite(25,LOW);//右下 5
        digitalWrite(16,HIGH);//右上 5
        digitalWrite(22,LOW);//中段 5
        digitalWrite(23,LOW);//上段 5
        digitalWrite(27,LOW);//下段 5
        digitalWrite(26,HIGH);//左下 5
        digitalWrite(21,LOW);//左上 5
        delay(5);
         ;} 
       if("%02d",tm->tm_hour ==6  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 6
        digitalWrite(25,LOW);//右下 6
        digitalWrite(16,HIGH);//右上 6
        digitalWrite(22,LOW);//中段 6
        digitalWrite(23,LOW);//上段 6
        digitalWrite(27,LOW);//下段 6
        digitalWrite(26,LOW);//左下 6
        digitalWrite(21,LOW);//左上 6
        delay(5);
         ;} 
        if("%02d",tm->tm_hour ==7  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 7
        digitalWrite(16,LOW);//右上 7
        digitalWrite(22,HIGH);//中段 7
        digitalWrite(23,LOW);//上段 7
        digitalWrite(27,HIGH);//下段 7
        digitalWrite(26,HIGH);//左下 7
        digitalWrite(21,HIGH);//左上 7
        delay(5);
         ;} 
        if("%02d",tm->tm_hour ==8  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 8
        digitalWrite(16,LOW);//右上 8
        digitalWrite(22,LOW);//中段 8
        digitalWrite(23,LOW);//上段 8
        digitalWrite(27,LOW);//下段 8
        digitalWrite(26,LOW);//左下 8
        digitalWrite(21,LOW);//左上 8
        delay(5);
         ;} 
       if("%02d",tm->tm_hour ==9  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 9
        digitalWrite(16,LOW);//右上 9
        digitalWrite(22,LOW);//中段 9
        digitalWrite(23,LOW);//上段 9
        digitalWrite(27,LOW);//下段 9
        digitalWrite(26,HIGH);//左下 9
        digitalWrite(21,LOW);//左上 9
        delay(5);
         ;} 
       if("%02d",tm->tm_hour ==10  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
         digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 0
        digitalWrite(16,LOW);//右上 0
        digitalWrite(22,HIGH);//中段 0
        digitalWrite(23,LOW);//上段 0
        digitalWrite(27,LOW);//下段 0
        digitalWrite(26,LOW);//左下 0
        digitalWrite(21,LOW);//左下 0
        delay(5);
         ;} 
     if("%02d",tm->tm_hour ==11  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
         digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
       digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
         ;} 
       if("%02d",tm->tm_hour ==12  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
         digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
       digitalWrite(25,HIGH);//右下 2
        digitalWrite(16,LOW);//右上 2
        digitalWrite(22,LOW);//中段 2
        digitalWrite(23,LOW);//上段 2
        digitalWrite(27,LOW);//下段 2
        digitalWrite(26,LOW);//左下 2
        digitalWrite(21,HIGH);//左上 2
        delay(5);
         ;} 
         if("%02d",tm->tm_hour ==13  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
         digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 3
        digitalWrite(16,LOW);//右上 3
        digitalWrite(22,LOW);//中段 3
        digitalWrite(23,LOW);//上段 3
        digitalWrite(27,LOW);//下段 3
        digitalWrite(26,HIGH);//左下 3
        digitalWrite(21,HIGH);//左上 3
        delay(5);
         ;} 
         if("%02d",tm->tm_hour ==14  ){
        digitalWrite(13,HIGH);//1桁目 1
        digitalWrite(17,LOW);//2桁目 0
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
         digitalWrite(25,LOW);//右下 1
        digitalWrite(16,LOW);//右上 1
        digitalWrite(22,HIGH);//中段 1
        digitalWrite(23,HIGH);//上段 1
        digitalWrite(27,HIGH);//下段 1
        digitalWrite(26,HIGH);//左下 1
        digitalWrite(21,HIGH);//左上 1
        delay(5);
        digitalWrite(13,LOW);//1桁目 0
        digitalWrite(17,HIGH);//2桁目 1
        digitalWrite(18,LOW);//3桁目 0
        digitalWrite(19,LOW);//4桁目 0
        digitalWrite(25,LOW);//右下 4
        digitalWrite(16,LOW);//右上 4
        digitalWrite(22,LOW);//中段 4
        digitalWrite(23,HIGH);//上段 4
        digitalWrite(27,HIGH);//下段 4
        digitalWrite(26,HIGH);//左下 4
        digitalWrite(21,LOW);//左上 4
        delay(5);
         ;} 
      以下略

こんな調子で1,2桁目を時間、3、4桁目を分にすれば一般的なデジタル時計ができる。
同時に1~4桁表示できないので5ミリ秒ずつ表示をずらして残像で表示するダイナミック点灯方式の7セグメントを使用した。



これで指定のWi-Fi環境にあればズレるとなく時間を刻み続ける。 現在屋外照明のタイマーなどは何年もすればすぐずれてしまうが、IoT機器がどんどん増えていけば、正確にON、OFFができる様になるかもしれない。







拍手[0回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30