赤外線リモコンリピーター(中継器)(1)

過日,switchbotハブ2 というものを購入,便利に使うようになりました。switchbotハブ2で,居間の電気
のコントロールだけをしていますが,隣の台所の電灯もコントロールすべくいろいろしらべましたが,
switchbotハブ2は各部屋ことに設置するのが基本のようで,それを実現すると結構な出費になりますので,
赤外線リモコンリピーター(中継器)を使ってみることにしました。
〇Zonには,いろいろでているようですが,1000円ちょっとの物をポチリました。

仕組みが気になってたので,あれこれ想像をめぐらしました。簡単な基盤が入っているのは多分,受光部
だろうということで,接合部を分解してみました。

思った通り,接合部は,写真のように単なる接合だけでした。とすると,受光部には,38KHzの発信をす
部分もあるようです。
仕組みがだいたい想像できましたので,分解して,あれこれ実験をしました。テレビでは,うまくリピー
トできましたが,台所の電灯では,だめでした。多分,赤外線LEDの出力が弱いからかと思い,増幅してみよ
うと思い,秋月に,高出力の赤外線LEDと,増幅用のMOSFETを注文しました。

ブレッドボードで,簡単な回路を組んで,実験をしてみようと思います。

高輝度の赤外線LEDは高いです。通常の赤外線LEDは10個で200円ぐらいなのに,一個で300円もします。
約15倍です。MOSFETは,基盤設置ようなので,ピッチ変換の基盤も購入して,ハンダ付けが必要です。

あれこれ実験を開始しましたが,リピーターの赤外線発信器の赤外線LEDを破損してしまったようで,別の
赤外線LEDで実験をしようと思います。

レオのバラ

我が家の愛犬レオがなくなってからしばらくたちますが,同じ名前だということで買ったレオナルド・ダビン
チという名前のばらが今年は,沢山花をつけました。一度,根本から折れてしまって,すぐに挿し木をしたの
ですが,挿し木の何本かが立派に根付ていまも元気にそだってます。

2つの鉢に植えていますが2つとも,沢山花がさきました。

色あいが違いますが,同じバラから挿し木したバラです。最初のはiphon,二枚目は,NikonのCOOLPIXでの
撮影です。色合いは,二枚目の方が実際に近いです。

ESP32 MAX7219 DS1307 時計表示

ESP32をいじってます。MAX7219のドライブの8桁7セグLEDを時計風にしてみました。マトリックスのLED
ではNETより時刻を取得して表示していましたが,今回は,DS1307のRTCのモジュールを使ってみました。

このモジュールについては,諸兄が詳しくHPに掲載していますので,そちらが参考になりますので,覚え
書きに記録します。使うにあたって,諸兄のHPを参考に,基板上のダイオードと抵抗をはずしました。
このモジュールは,バックアップ用に,充電式のボタン電池を使う仕様になっているので,非充電用の
ボタン電池を使うと不具合が起こるようなので,通常のボタン電池で,使えるようにしました。また,
このモジュールをESP32に使うのに〇ZON購入のレベルシフターを使いました。

SWITCHSIENCEで以前に購入したものは保持していたのですが,1つしかなかったので,購入しましたが,
6個中2個が不良でした。安いので,こんなもんでしょうかね。RTCのモジュールは,3.3Vでも動き
ましたが,シフターをはさみました。

動画のような表示ですが,シリアルコンソールから,’y’の入力で,西暦と月を,’m’の入力で,月と
日にちと曜日を表示するようにしました。もっとも,曜日は,数字のままで,今日は,日曜日なので,
0の表示です。
RTCもモジュールは,はじめに初期設定の時刻を書き込みますが,ネットより時刻を取得して,それを
書き込むようにしてあります。下記のようなスケッチですが,使ってない関数もあります。

#include <SPI.h>
#include <Wire.h>
#include <time.h>
#include <WiFi.h>


//時刻設定
#define JST     3600* 9
#define RTC_address 0x68


//DS1307設定
//const char *week[] = {"日","月","火","水","木","金","土"};
const char *week[] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

uint8_t REG_table[8];

// MAX7219 Command address
#define MAX7219_TEST 0x0f
#define MAX7219_BRIGHTNESS 0x0a
#define MAX7219_SCAN_LIMIT 0x0b
#define MAX7219_DECODE_MODE 0x09
#define MAX7219_SHUTDOWN 0x0C

//SPI設定
#define CS_PIN 5//CLK 18 DIN 23
#define LED_CLK 18
#define LED_DIN 23

//Wifys接続設定

const char* ssid = "***************";
const char* password = "**************";
//const char* ssid = "*****************";
//const char* password = "**************";

struct tm timeInfo;//時刻を格納するオブジェクト
char s[30];//時刻文字格納用

/***********************************************************
*SPIデータ送信--SPIライブラリー使用
*
************************************************************/
void maxTransfer(uint8_t address, uint8_t value) {
   digitalWrite(CS_PIN, LOW);  // Start transfer.
   SPI.transfer(address);      // Send address.
   SPI.transfer(value);        // Send the value.
   //digitalWrite(CS_PIN, HIGH); // Finish transfer.
}

/**********************************************************
*MAX7219初期設定
*
***********************************************************/
void MAX7219_INI(){
   maxTransfer(MAX7219_DECODE_MODE, 0b11011011);// 3.4はデコードしない
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_BRIGHTNESS, 0x01); // Use lowest intensity.
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_SCAN_LIMIT, 0x07); // Display digits 01234567
      digitalWrite(CS_PIN, HIGH);

   maxTransfer(MAX7219_SHUTDOWN, 0x01);    // Normal Operation
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_TEST, 0x00);        // Normal Operation
      digitalWrite(CS_PIN, HIGH);  
}

/******************************************************************
*今回使った書き込み関数
*
*******************************************************************/
void LED_OUT(uint8_t addr, uint8_t dat){
  digitalWrite(CS_PIN, LOW);
  shiftOut(LED_DIN, LED_CLK, MSBFIRST, addr);
  shiftOut(LED_DIN, LED_CLK, MSBFIRST, dat);
  digitalWrite(CS_PIN, HIGH);
}

/********************************************************************
*int ch_to_int(char,char)
*
*********************************************************************/
int ch_to_int(char a,char b){

  int buff;
  int c=a-'0';//charをintに変換
  int d=b-'0';//charをintに変換
  buff=(c<<4) | d;
  return buff;  
}


/********************************************************************
*7セグ初期化
*
*********************************************************************/
void sevn_seg_init(){
  LED_OUT(0x9, 0b11011011);   //7セグでデコードするビットに1を立てる:
  LED_OUT(0xA, 5);   //輝度を設定, 0-15:
  LED_OUT(0xB, 7);    //使用する桁数を指定, 桁数-1:
  LED_OUT(0xC, 1);    //特にいじる必要なし:
  LED_OUT(0xF, 0);    //同上:
}
/************************************************************************************************************************************
*Set up
*
**********************************************************************/
void setup() {
 
  Wire.begin();
  Serial.begin(115200);


  pinMode(CS_PIN,  OUTPUT);
  pinMode(LED_CLK, OUTPUT);
  pinMode(LED_DIN, OUTPUT);
 
  digitalWrite(CS_PIN,  HIGH);
  digitalWrite(LED_CLK, LOW);
  digitalWrite(LED_DIN, LOW);


//Wify接続
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());


 //Netより時刻を取得
  configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
  getLocalTime(&timeInfo);//tmオブジェクトのtimeInfoに現在時刻を入れ込む
  sprintf(s, " %04d/%02d/%02d %02d:%02d:%02d:%02d",
          timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday,
          timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec,timeInfo.tm_wday);//人間が読める形式に変換
  delay(800);


Serial.print(s[1]);//西暦
Serial.print(s[2]);
Serial.print(s[3]);
Serial.print(s[4]);
Serial.print("-");
Serial.print(s[6]);//月
Serial.print(s[7]);
Serial.print("-");
Serial.print(s[9]);//日
Serial.print(s[10]);
Serial.print("-");
Serial.print(s[12]);//時
Serial.print(s[13]);
Serial.print("-");
Serial.print(s[15]);//分
Serial.print(s[16]);
Serial.print("-");
Serial.print(s[18]);//秒
Serial.print(s[19]);
Serial.print(s[20]);
Serial.print(s[21]);
Serial.println(s[22]);
//Serial.println(s[23]);

//RTCに現在時刻データを書き込む
  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.write(ch_to_int(s[18],s[19]));//second
  Wire.write(ch_to_int(s[15],s[16]));//minute
  Wire.write(ch_to_int(s[12],s[13]));//hour
  Wire.write(s[22]-'0');//week  
  Wire.write(ch_to_int(s[9],s[10]));//day
  Wire.write(ch_to_int(s[6],s[7]));//month
  Wire.write(ch_to_int(s[3],s[4]));//year
  Wire.endTransmission();

  digitalWrite(CS_PIN,  HIGH);
  digitalWrite(LED_CLK, LOW);
  digitalWrite(LED_DIN, LOW);
 
  LED_OUT(0x9, 0b11011011);   //7セグでデコードするビットに1を立てる:
  LED_OUT(0xA, 5);   //輝度を設定, 0-15:
  LED_OUT(0xB, 7);    //使用する桁数を指定, 桁数-1:
  LED_OUT(0xC, 1);    //特にいじる必要なし:
  LED_OUT(0xF, 0);  
 
 //7セグ初期設定
  //sevn_seg_init();


//7セグに表示
  LED_OUT(0x3, 1);            //3ケタ目'-'
  LED_OUT(0x6, 1);            //6ケタ目'-'
}


char h_on=1;
char y_on=0;
char m_on=0;

/*****************************************************************
*メインループ
*
******************************************************************
void loop() {


  char inkey;


  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.endTransmission();


//RTCデータの読み込み
  Wire.requestFrom(RTC_address,7);


  for(int i=0;i<=7;i++){
    REG_table[i]=Wire.read();
  }


if( Serial.available() > 0  ) {
    inkey = Serial.read();
    switch (inkey){
      case 'h':h_on=1;
               y_on=0;
               m_on=0;
               break;
      case 'y':h_on=0;
               y_on=1;
               m_on=0;
               break;
      case 'm':h_on=0;
               y_on=0;
               m_on=1;
               break;    
    }
  }



if(h_on==1){//時分秒を表示
  LED_OUT(0x9, 0b11011011);


  LED_OUT(0x1, REG_table[0]); //秒を表示
  LED_OUT(0x2, REG_table[0]>>4);//10秒を表示


  LED_OUT(0x3, 1);


  LED_OUT(0x4, REG_table[1]);//分を表示
  LED_OUT(0x5, REG_table[1]>>4);//分を表示


  LED_OUT(0x6, 1);


  LED_OUT(0x7, REG_table[2]);//時を表示
  LED_OUT(0x8, REG_table[2]>>4);//時を表示
}


if(y_on==1){//年号月の表示
    LED_OUT(0x9, 0b11111111);
    LED_OUT(0x8,2);
    LED_OUT(0x7,0);
    LED_OUT(0x6,REG_table[6]>>4);
    LED_OUT(0x5,REG_table[6]);
    LED_OUT(0x4,0xF);
    LED_OUT(0x3,0xF);
    LED_OUT(0x2,REG_table[5]>>4);
    LED_OUT(0x1,REG_table[5]);
}
if(m_on==1){//月日曜日の表示
    LED_OUT(0x9, 0b11111111);
    LED_OUT(0x8,REG_table[5]>>4);//月
    LED_OUT(0x7,REG_table[5]);
    LED_OUT(0x6,0xF);
    LED_OUT(0x5,REG_table[4]>>4);//日
    LED_OUT(0x4,REG_table[4]);
    LED_OUT(0x3,0xF);
    LED_OUT(0x2,REG_table[3]);//曜日
    LED_OUT(0x1,0xF);
}


}

SwitchBotを取り付けました。(2)

調子がよかったので,追加で,Switchbotを購入し,併せて,Switchbotハブ2も購入して取り付けました。
Switchbotは,前回取り付けたものの下のスイッチにつけました。このスイッチは,換気扇用のタイマーで
すが,玄関外の街灯を時間で消すのにとりつけていました。

Switchbotだけでも,ON OFF ができるようですが,このタイマーを導入したのは,Switchbotを知るずっ
と前でしたので,Switchbotで街灯をつける,タイマーで街灯を消灯する,の動作になります。
併せて購入したSwitchbotハブ2は,居間のライトのコントロールに使います。

Switchbotハブ2の箱は,Switchbotの箱の2倍ぐらいの大きさでが(値段は,倍以上),高性能のようです。
毎日,実家に行くのに不用心とのことで,居間の電気は,つけっぱなしにしてましたが,Switchbotハブ2の
オートメーションの機能で,定時に点灯できますので,出かけるときは,消えてても,帰ってくるときには,
明るい居間と玄関に戻ることができます。Switchbotハブ2は,とりあえず,テーブルの上に置いて設定しま
したが,もう少ししたら,柱にセッティングします。

このオートメーションの機能を使うと,室温の管理をし,一定温度以上になったら,クーラーを自動でつける
一定温度以下になったら,クーラーを止める,なんてこともできるようです。
今のところ,bluetooh でコントロールする,Switchbot の操作は,まだ,ネット経由ではできないようで
すが,アプリのバージョンアップで対応できるそうです。

SwitchBotを取り付けました。(1)

主がいなくなってしまった実家に,短い時間ですが,毎日通ってます。実家で夕食を作って食べてからこちら
にもどってくるのですが,20時近くになってしまうので,あたりはくらくなってしまいます。本当は,電気
をつけたままにしておけばいいのでしょうか,電気代がもったいないので,付いてから一端玄関から上がって
玄関の電気を使えてから,荷物を取りに車までも¥どります。その間,電気が付くまで足下が暗くて危ないの
で,SwitchBotをつけて遠隔で電気が付くようにしました。

取り付けるにあたって,周りが土壁?で,接着剤等利きにくいので,取り付けアダプター?を使いました。

このアダプターを既存のスイッチプレートの下に挟みこむようにして取り付け,SwitchBotをつけました。
アダプターの取説にあるように,SwitchBotにもともと付いている両面テープはついてい位置が,いまいちな
のではがして,予備の両面テープをはりました。取り付けて二日目ですが,具合いいようです。

取り付けのアダプター?はよく見ると,積層構造?のようで,もしかして3Dプリンターでの品物かなと想像
しました。今回は,玄関の蛍光灯用につけましたが,換気扇の表示のスイッチは,玄関の街灯のもので,時
間がくると切れるようになってますが,ここにもSwitchBotをつけると,SwitchBotのタイマーがつかえるの
自動で付いたり消したりできるようになるかなと思います。そそのうちつけようかなと思います。

やっと実が付きました。2つだけ!!

何年か前,多分コロナが流行るまえだったかと思いますが,サクランボの苗木を購入して鉢植えにしました。
一種類では実が付かないというので,最初に佐藤錦をかいましたが,高砂をあとから買い足し鉢植えにしま
した。

写真右側が佐藤錦で左が高砂です。
一昨年あたりから,花咲き始めましたが,実はなりませんでした。今年は,佐藤錦だけ花が先にさき,高砂は
花がまださきません。このままでは,受粉できないので,今年も実はならないかな,と思ってましたが,なん
と小さなマッチ棒ほどの実が2つほどつきました。

赤く色づいてくれるかわかりませんが,どのように育つか,楽しみです。