2026年8月20日木曜日

パキラの強剪定とその後

今年の4月上旬、茎?幹?がひょろひょろ伸びて2メートル近くになっていたパキラ強剪定しました。伸びた先の方にしか葉っぱがついてなくて情けない状態だった。その時の写真は撮り忘れた。

ネットで調べるとパキラは強剪定してもまた芽がでてくるらしかったので、思い切って剪定してみました。写真は剪定してから2週間後位で切り口が乾き始めているとき。越冬していたリビングから外に出す際に撮影。白い粒々は肥料のマグアンプ


で、約4か月後、無事に復活しました。すばらしい生命力。冬がくるまでは日当たりのよい屋外で過ごします。

剪定した長い茎は15cm位に切って小さな植木鉢に挿しておいたら葉っぱがでてきました。こちらもすごい生命力。パキラの鉢植えが10個以上に増殖してしまいました。この冬の越冬場所を確保するのが大変。

ということで、パキラの強剪定は無事に終えることができたので記録に残した次第です。

2026年8月15日土曜日

2ch温度ロガー(デジタル温度センサ版)の回路図・スケッチ

夏休み、少し帰省していました。帰省してもやることは庭木の剪定、伐採、草むしり、除草剤撒きなど自宅と同じです。あとお墓参り。往路では大渋滞にはまり普段の2倍の時間がかかり、帰路では高速で台風一過の土砂降りに見舞われトホホです。

天気鍋は結構利用していますが、雲が多くて最高温度記録は更新できていません。最高温度に達する前にお昼のそうめん冷や麦に使ってしまうのも一因ですが。今日は冷やし中華に利用。午前中、雲が多くて温度は60℃弱でした。

天気鍋の温度推移の記録に使っている2ch温度ロガーは昨年9月に作り始め、今年の2月には、回路図・スケッチをアップしていました(アップしたことを忘れていた)。ところが、温度センサの防水が破れて異常値を記録 するようになってしまったため、急遽 防水対応のデジタル温度プローブへの交換を行いました。最初からこれを使えばよかった。

以下、これまでの経緯です。

主な機能は以下の通り。
  • 測定の正確な日時はWiFi経由のntpサーバから取得
  • microSDのsetup.txtファイルに平文でWiFiのSSID,Password 及び測定時間間隔のデフォルトの番号を記載(0:1秒, 1:10秒, 2:30秒, 3:1分, 4:5分, 5:10分)
     例)
    SSID mySSID
    PW   myPassWord
    Interval 0
  • 時間間隔は電源投入後にタクトスイッチでも変更可能(5秒経過すると測定を開始)
  • WiFiがない環境で使う際は、タクトスイッチを押しながら電源オン
    WiWi設定があっても繋がらない場合には、複数回トライして諦める
    WiWiがない場合、或いは何度トライして繋がらない場合には日時を26年1月1日00:00:00とする
  • ログはmicroSD内にタイムスタンプ付のcsvファイルとして格納する
    WiFiに繋がない、繋がらない、ntpサーバに繋がらない際の日時は 2026-01-01 00:00:00となる
  • ファイル名が重複する場合にはファイル名に追番が付く
  • 測定は指定した時刻が時間間隔で正時になったとき
  • 例)10秒毎なら0秒、10秒、20秒…のとき、1分毎なら毎分0秒のとき
  • スリープから1秒毎の割り込みで目覚めて正時になったか確認(再びスリープ)
デジタル温度センサ(プローブ)へ交換したあとの回路図とスケッチです。無保証です。ハード、ソフトの修正をできるだけ少なく済ませたので無駄な処理などもあります。今ならAIがもっとスマートなコードを書いてくれそう。


//---------------------------------------------------------------------------------------
//                                                                         '26.07.29 naka
//                                                                         '26.01.31 naka
//                                                                   ver.0 '25.09.14 naka
//  ESP32 2ch温度ロガー(小型液晶に時刻も表示)
//
//  ・測定の正確な日時はWiFi経由のntpサーバから取得
//  ・microSDのsetup.txtファイルに平文でWiFiのSSID,Password 及び測定時間間隔の
//    デフォルトの番号を記載(0:1秒, 1:10秒, 2:30秒, 3:1分, 4:5分, 5:10分)
//    例)SSID mySSID
//        PW   myPassWord
//        Interval 0
//  ・時間間隔は電源投入後にタクトスイッチでも変更可能(5秒経過すると測定を開始)
//  ・WiFiがない環境で使う際は、タクトスイッチを押しながら電源オン
//  ・WiWi設定があっても繋がらない場合には、複数回トライして諦める
//  ・WiWiがない場合、或いは何度トライして繋がらない場合には日時を26年1月1日00:00:00とする
//  ・ログはmicroSD内にタイムスタンプ付のcsvファイルとして格納する
//  ・ファイル名が重複する場合にはファイル名に追番が付く
//  ・WiFiに繋がない、繋がらない、ntpサーバに繋がらない際の日時は"2026-01-01 00:00:00"となる
//  ・測定は指定した時刻が時間間隔で正時になったとき
//    例)10秒毎なら0秒、10秒、20秒…のとき、1分毎なら毎分0秒のとき
//  ・スリープから1秒毎の割り込みで目覚めて正時になったか確認(再びスリープ)
//
//  改版履歴
//  '26.07.29 センサをディジタルセンサDS18B20に変更
//---------------------------------------------------------------------------------------
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP32Time.h>
#include <SD.h>
#include "FS.h"
#include "SPIFFS.h"
#include "esp_adc_cal.h"
ESP32Time rtc;

#define SD_CS 16   // SD card chip select
#define TACT_SW 25 // タクトスイッチ(WiFi未使用指示、測定時間間隔セット用)
const int SENSOR_PIN1 = 32; // 温度センサの出力ピンを接続
const int SENSOR_PIN2 = 33; // 温度センサの出力ピンを接続

esp_adc_cal_characteristics_t adc_chars;

#define SETUP_FILE "/setup.txt"
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;

// デジタルセンサ
// https://github.com/PaulStoffregen/OneWire
#include <OneWire.h>
// https://github.com/milesburton/Arduino-Temperature-Control-Library
#include <DallasTemperature.h>
#define TEMPERATURE_PRECISION 12 // sensor resolution: 9 - 12bit

OneWire oneWireCh1(SENSOR_PIN1);
OneWire oneWireCh2(SENSOR_PIN2);
DallasTemperature sensorsCh1(&oneWireCh1);
DallasTemperature sensorsCh2(&oneWireCh2);
DeviceAddress tempDeviceAddressCh1;
DeviceAddress tempDeviceAddressCh2;

// microSDのsetupファイルに記載されているものが設定される
char ssid[24];
char password[24];

int interval;
int interval_i = 0;
const int interval_tbl[] = {1,10,30,60,300,600}; // 測定間隔(秒)
const int interval_tbl_size = 6;
char LogFile[64]; // 記録用のcsvファイル名(タイムスタンプから自動作成)

void setup()
{
  char msg[17];
  struct tm timeinfo;
  char logfilename[64];

  pinMode(TACT_SW, INPUT);

  // モニタLCD設定
  SetupLCD();
  delay(1000);

  // setupファイルを読み、WiFiのssid,password、測定間隔のデフォルトを取得
  if (!SD.begin(SD_CS, SPI, 24000000)) {
    dispLCD_msg("microSD failed  ","                ");
    while(true); 
  }
  read_setup_file(SETUP_FILE);

  bool wifi_flag = false;
  if (digitalRead(TACT_SW)==LOW) {
    dispLCD_msg("WiFi dosen't use","                ");
    while(digitalRead(TACT_SW)==LOW);
  }
  else {
    dispLCD_msg("Connecting WiFi ","                ");
    if (wifi_connect()) {
      wifi_flag = true;
    }
    else {
      dispLCD_msg("Connect failed  ","                ");
      delay(1000);
    }
  }
  delay(1000);

  if (wifi_flag) {
      // WiFi接続に成功した場合、NTPサーバに接続し、時刻設定
      configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); 
      int loopcnt = 0;
      while (!getLocalTime(&timeinfo)) {
        dispLCD_msg("Failed get time ","Retrying ...    ");
        if (++loopcnt>5) { // 念のため5回繰り返してダメなら抜ける
          wifi_flag = false;
          break; 
        }
        delay(500);
      }
    dispLCD_msg("                ","                ");
    wifi_disconnect(); // 以降はWiFi未接続にする
  }

  // 起動時にSWが押されていたか、WiFi接続に失敗か、ntpサーバからの時刻取得に失敗した場合は下記の日付と時刻設定
  if (!wifi_flag) {
    rtc.setTime(1767225600); // 2026-01-01 00:00:00		
  }

  // 測定時間間隔の設定(5秒無操作で戻ってくる)
  set_interval();

  // デジタルセンサ
  sensorsCh1.getAddress(tempDeviceAddressCh1, 0); // get device0 address
  sensorsCh1.setResolution(tempDeviceAddressCh1, TEMPERATURE_PRECISION); // set resolution
  sensorsCh2.getAddress(tempDeviceAddressCh2, 0); // get device0 address
  sensorsCh2.setResolution(tempDeviceAddressCh2, TEMPERATURE_PRECISION); // set resolution

  sensorsCh1.begin();
  sensorsCh2.begin();

  // ダミーで1回空読み(1発目に-127℃が返ってくることがあったので)
  sensorsCh1.requestTemperatures(); // request temp.
  float temp = sensorsCh1.getTempCByIndex(0); 
  sensorsCh2.requestTemperatures(); // request temp.
  temp = sensorsCh2.getTempCByIndex(0); 

  // ログファイル名を決めるためにタイムスタンプ取得
  getLocalTime(&timeinfo);
  sprintf(logfilename, "%02d%02d%02d_%02d%02d%02d.csv",(timeinfo.tm_year + 1900)%100, timeinfo.tm_mon + 1, timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

  // WiFiに繋がない場合、時刻情報を取得できないためタイムスタンプのファイル名が同じになることを防ぐ。
  get_unique_filename("",logfilename,LogFile,sizeof(LogFile));

  // 測定開始メッセージ
  dispLCD_msg("Start           ","     measurement");

  // 1,000,000us = 1sのタイマー設定
  esp_sleep_enable_timer_wakeup(1000000);

}

void loop()
{ 
  // 温度を測定してログファイルに書き出す
  measurement(interval);

  // ライトスリープ(タイマー割り込みで1秒毎に目覚める)
  esp_light_sleep_start();
}

void set_interval() {
  disp_interval(interval_i); // 現在の設定時間を表示

  int prevmsec = millis();
  while ((millis() - prevmsec)<5000) {  // 5秒反応が無ければ時間設定を抜ける
    if (digitalRead(TACT_SW)==LOW) {
      interval_i++;
      prevmsec = millis();
      if (interval_i>=interval_tbl_size) interval_i = 0;

      disp_interval(interval_i); // 現在の設定時間を表示
      while (digitalRead(TACT_SW)==LOW) {}  // SWが離されるまで待つ
      delay(20); //チャタリング対策
      prevmsec = millis();
    }
  }

  interval = interval_tbl[interval_i];
  return;
}

void disp_interval(int i) {
  int time = interval_tbl[i];
  char msg[20];

  if (time<60)
    sprintf(msg,"%11d(sec)",time);
  else
    sprintf(msg,"%11d(min)",time/60);
  dispLCD_msg("set interval    ",msg);
}

void measurement(int period) {
  char yymmddhhmmss[17],hhmmss[10],timestamp[17];
  struct tm timeinfo;
  getLocalTime(&timeinfo);

  // 測定する時間なのか確認(割り込みは1秒毎なので)
  bool flag = false;
  if (period==1) flag = true;
  else if (period==10 && timeinfo.tm_sec%10==0) flag = true; 
  else if (period==30 && timeinfo.tm_sec%30==0) flag = true; 
  else if (period==60 && timeinfo.tm_sec==0)    flag = true; 
  else if (period==120 && timeinfo.tm_sec==0 && timeinfo.tm_min%2==0) flag = true; 

  if (flag) {
    sprintf(timestamp,"%02d:%02d:%02d",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
    sprintf(yymmddhhmmss, "%02d%02d%02d %s",(timeinfo.tm_year + 1900)%100, timeinfo.tm_mon + 1, timeinfo.tm_mday, timestamp);

    float temp1 = sens_temp_digitalCh1();
    float temp2 = sens_temp_digitalCh2();
    char buff1[8],buff2[8],buff[24];
    dtostrf(temp1,4,1,buff1);
    dtostrf(temp2,4,1,buff2);
    sprintf(buff, "%4s%cC , %4s%cC",buff1,0xDF,buff2,0xDF);
    dispLCD_msg(yymmddhhmmss,buff);

    write_logfile(timestamp,buff1,buff2);  // microSDに書き込み
  }

}

float sens_temp_digitalCh1() {
  float temp;
  sensorsCh1.requestTemperatures();       // request temp.
  temp = sensorsCh1.getTempCByIndex(0);   // get temp.
  return temp;
}

float sens_temp_digitalCh2() {
  float temp;
  sensorsCh2.requestTemperatures();       // request temp.
  temp = sensorsCh2.getTempCByIndex(0);   // get temp.
  return temp;
}

void dispLCD_msg(char msg1[],char msg2[]) {
  lcd.clear();
  lcd.setCursor(0, 0); // Col,Raw
  lcd.print(msg1);
  lcd.setCursor(0, 1); // Col,Raw
  lcd.print(msg2);
}

void write_logfile(char* timestamp, char* buff1,char* buff2){
  char buff[32];
  File outputFile = SD.open(LogFile,FILE_APPEND);
  
  sprintf(buff,"%s,%s,%s",timestamp,buff1,buff2);
  outputFile.println(buff);
  outputFile.close();
}

void SetupLCD() {
  delay(150);
  lcd.begin();
  lcd.command(0x38);
  delay(1);
  lcd.command(0x39);
  delay(1);
  lcd.command(0x14);
  delay(1);
  lcd.command(0x71);
  delay(1);
//  lcd.command(0x51);  // 5V
  lcd.command(0x56);  // 3.3V
  delay(2);
  lcd.command(0x6c);
  delay(300);
  lcd.command(0x38);
  delay(1);
  lcd.command(0x01);
  delay(2);
  lcd.command(0x0c);
  delay(2);
}

// Wifi接続
bool wifi_connect() {
  char msg[128];
  bool connected = false;

  for (int i=0;i<3;i++) { // WiFi接続、3回繰り返す
    WiFi.begin(ssid, password);    
    long int StartTime=millis();
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        if ((StartTime+5000) < millis()) break; // 5秒待って繋がらないときは諦める
    } 
  
    if (WiFi.status() == WL_CONNECTED) {
      IPAddress ip = WiFi.localIP();
      sprintf(msg,"%d.%d.%d.%d",ip[0], ip[1], ip[2], ip[3]);
      dispLCD_msg("Connected IP    ",msg);
      connected = true;
      break;
    }
    delay(100);
  } 

  if (connected)
    return true;
  else {
    wifi_disconnect();
    delay(100);
    return false;
  }

}

void wifi_disconnect() {
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

int read_setup_file(char* fileName) {
  char  buff[128];
  char  key[128],val[128];

  File setupFile = SD.open(fileName,FILE_READ);
  if (setupFile) {
    while (readLine(setupFile,buff)>=0) {
      if (buff[0]!='#') {
        sscanf(buff,"%s %s",&key,&val);
        if (strcmp(key,"SSID")==0) {
          strcpy(ssid,val);
        }
        else if (strcmp(key,"PW")==0) {
          strcpy(password,val);
        }
        else if (strcmp(key,"Interval")==0) {
          int ival;
          sscanf(val,"%d",&ival);
            if (ival>=0 && ival<interval_tbl_size) { // 異常値チェック
              interval_i = ival;
            }
          }
      }
    }
    setupFile.close();
  }

  return 0;
}

// microSDから1行読み取る
int readLine(File fp, char *buff){
  int i = 0;
  if(!fp.available()) {
    return -1;
  }
  while (fp.available()) {
    char c = fp.read();
    if (c=='\r');
    else if (c=='\n') break;
    else buff[i++] = c;
  }
  buff[i] = 0;
  
  return i;
}

/**
 * 重複しないファイル名を生成する関数 (ChatGPTに書いてもらった)
 * @param fs_prefix マウントポイント (例: "/spiffs")
 * @param base_name 元のファイル名 (例: "data.txt")
 * @param out_path  結果を格納するバッファ
 * @param max_len   バッファの最大サイズ
 */
void get_unique_filename(const char* fs_prefix, const char* base_name, char* out_path, size_t max_len) {
    char temp_path[128];
    char name_part[64];
    char ext_part[16];
    
    // 拡張子を探す
    const char *dot = strrchr(base_name, '.');
    if (dot) {
        size_t name_len = dot - base_name;
        strncpy(name_part, base_name, name_len);
        name_part[name_len] = '\0';
        strcpy(ext_part, dot);
    } else {
        strcpy(name_part, base_name);
        ext_part[0] = '\0';
    }

    // 最初は元の名前でチェック
    snprintf(out_path, max_len, "%s/%s", fs_prefix, base_name);
    struct stat st;
    int counter = 1;

    // ファイルが存在し続ける間、ループ
    while (SD.exists(out_path)) {
        // "パス/ベース名 + 数字 + 拡張子" を組み立て
        snprintf(out_path, max_len, "%s/%s_%d%s", fs_prefix, name_part, counter, ext_part);
        counter++;
        
        // 無限ループ防止(必要に応じて)
        if (counter > 999) break; 
    }
}

//---------------------------------------------------------------------------------------
// EOF
//---------------------------------------------------------------------------------------

2026年8月9日日曜日

夏休みの自由研究:ソーラークッカー 天気鍋(鍋蓋あり)とナビ異常

今朝、クルマに乗ったらナビが「12月25日、クリスマスです」と喋ったのでビックリ。日付の認識がおかしくなっている。しばらく前から日付が変だなと思っていたけど、そのうち直るかと思いそのままにしていた。今日は流石におかしい、と思いナビの設定画面を調べた。でも日付設定のメニューは無い。確かにGPSから日時を得ているので、設定しなくてもいいはずだよね。

ググってみたら、GPSの週カウンタのロールオーバーが原因らしい。GPSはなんと週のカウンタが10ビット(0~1,023)で、起点が1980年1月6日とのこと。1,024週(約19.6年)でカウンタが0に戻ってしまうので、何も対策してないと年月日がおかしくなる。ちなみに我が家のナビはまだ19.6年は経過してないけど、ナビのプログラムが起点としたところから10ビットを越えたのだろう。

ナビ内部のカウンタを例えば16ビットとかにしておけば、GPSから飛んでくる週カウンタが0に戻ってもキャリー処理でナビでは継続してカウントできると思うけど、そうしてない理由は何だろう。そんなに長期間ナビが動くことを想定してなかった? 対策はファームの書き換えらしいけど、すでにサポートが終わっているかも。トヨタの販売店に電話したら現在夏季休業中とのこと。休業明けに電話してみる。

さて、天気鍋は今日も午前中雲が多かったけど出してみました。これまでと違い、今日は鍋の蓋を閉じてみました。これまでは透明バケツの蓋は閉じてましたが、鍋の蓋はステンレスで反射するので閉じてなかった。鍋の蓋を閉じた方が熱が逃げるのを防げるかも知れないのと、アルミホイルの反射板により鍋の側面から熱を加えられるので上面からの熱はあまり気にしなくてよいかも知れない。と思い、試してみました。


午前中、雲が多かったので温度上昇はゆっくり。お昼過ぎてから直射日光が連続して当たる様になりました。最高温度は14:00過ぎの73.4℃でした。蓋の効果はあったのか?


自然相手で条件が日々異なるので比較するのが難しい。

2026年8月8日土曜日

夏休みの自由研究:ソーラークッカー 天気鍋(手動太陽追尾)

待望の夏休みに入りましたが、初日は庭木の剪定です。午前中は曇が多くて剪定作業にはよかったのですが、天気鍋には厳しい条件でした。それでも熱中症に注意して、スポーツドリンク飲みながら1時間ごとに休憩し、午前中約3時間の作業でした。今日は剪定だけで草むしりまではできなかった。休み中、どこかでやらねば。

天気鍋は以下のような温度推移でした。今朝は曇っていたので太陽追尾のターンテーブルは出さずに実験。11時過ぎあたりから晴れ間も多くなったので、時々手動で太陽の方を向けていました。

11時頃まではあまり水温は上がらず55℃くらい。その後は太陽のおかげで上がり始め、最高温度は72.1℃でした。外気温が急激に上がっているところはセンサに直接太陽光が当たっていたためだと思う。手動太陽追尾のタイミングで影になるところに移した。

グラフで15:00頃に段があるのは、太陽に向け直したのが原因だと思う。太陽追尾はちゃんと効果があることが確認できたのかな、と思っている。

夏休み中、終日晴れる日を期待したいが、週間天気予報をみると来週はずっと曇りや雨が多そう。温度ロガーのプログラムや回路図をアップしていなかったので、需要があるか不明ですが、夏休み中になんとかしたい。

2026年8月2日日曜日

夏休みの自由研究:ソーラークッカー 天気鍋(太陽追尾の評価)

温度ロガーのセンサを防水デジタル温度センサに交換して天気鍋を評価してみました。

朝8:30頃に評価を開始。この時点ではまだ太陽が東の方にあって陽が当たっていないけど、一応太陽の方を向けてセット。まだ太陽追尾のターンテーブルを制御するarduinoブレッドボードのまま。効果が確認できたらユニバーサル基板に載せ替えるつもり。


お昼過ぎ、かなり熱くなってきて蓋に結露ができています。昼前あたりから時々雲が流れてきて直射日光が当たる時間が少なくなってきました。温度の記録更新は厳しそう。


温度変化の様子です。12:00頃に70℃に達した後はあまり上がりませんでした。最高水温は14:00過ぎに72.6℃を記録。残念ながらこれまでの記録75℃には達しませんでした。

交換した防水デジタル温度センサも今のところ調子よく動いています。


太陽追尾のターンテーブル
の効果は明確には分からない結果でしたが、昼頃には70℃になるので、そうめん冷や麦を茹でるには十分です。今日は記録をとるためにお昼の麺類はパスしました。

また暑くて終日快晴が期待できる日があったら記録を取ってみます。普段は特に記録せずに、かみさんが天気鍋を普段使いする予定。

2026年8月1日土曜日

夏休みのイベント;真夏のアイスショー他

7月最終日の金曜日は休みをとって、辰巳アイスアリーナで開催されたアイスショーにでかけました。りくりゅうペア初プロデュースのアイスショーとして話題になったもの。公式サイトThe Destinyはココ。真夏のアイスショーで外と中の温度差が、、、羽織るものを準備して観戦。オリンピック出場ペア、アイスダンスの生の演技を観ていたらあっという間。よかった。

写真は公演後のオフィシャル写真撮影の様子(演技中は写真撮影禁止)。一番前がりくりゅうペア。みんな軽々持ち上げていてスゴイ!!


この日はホテルをとってウォーターフロント周辺を散策。陽が落ちても暑いけど、海風があって多少はよい感じ。ビッグサイトの夜の風景は初めて。


朝はホテルでゆっくりしてチェックアウト時間間際に外にでるとすでに猛烈な暑さ。そんな中、豊洲市場に足を運びました。豊洲市場ができたのが2018年とのことなので、もう8年も経っているが初めて訪れた。

場外の飲食街と市場の見学コースを巡ってきましたが、インバウンドの外国人観光客が目立ちました。結構歩いた。ホテルでの朝食が遅かったのとたっぷり食べてしまったのでお腹が減らず、ここでの食事はパス。


帰りは高輪ゲートウェイシティの NEWoMan(ニューマン)高輪 に寄ってみました。LUFTBAUMという28階にある植物空間は圧巻。熱帯です。以前にきたときは駅前は何もなかったのに高層ビルが並び、巨大シティになってました。この街作りも資本集約産業か? これがペイできるのだからすごい。

建物内は快適ですが、外は猛烈な暑さと湿気です。体調崩しそうなので早めに帰宅しました。明日晴れたらセンサを交換した温度ロガーで天気鍋の評価をするつもり。

2026年7月30日木曜日

2ch温度ロガーの温度センサ交換

先日、天気鍋の水温測定中に異常値を記録した温度ロガーですが、レジンで封止した温度センサの防水が破れた模様だったので、最初から防水対応になっているデジタル温度センサに交換しました。ロガーの製作記事はこちら など。

写真は交換前のロガーと、新たに購入した防水デジタル温度センサです。ケーブルが予想より太い。これまでのアナログ温度センサの接続はコネクタにしてあったので容易に交換できます。ケース内左上のホットボンドで固めてあるのがピンヘッダを使ったコネクタ。


防水デジタル温度センサDS18B20というものでアマゾンで購入。2つでよかったが3つで安かったので、予備を考えて3個入り。


信号線にプルアップ抵抗が必要だったので、ユニバーサル基板の切れ端に抵抗を載せてピンヘッダを挿してコネクタ代わり。半田付け箇所が切れないようにホットボンドで固めています。あと、ケーブルが太かったのでチャンネル毎に別のゴムブッシュを通しました。


プログラム変更は、アナログセンサをAD変換して温度を読んでいた部分を、1ワイヤーのデジタル通信での読み取りにした。このセンサは複数センサを並列に繋いでも個別のアドレス毎に読み取れるらしいが、今回はこれまで2ポート使っていたのでそのままチャンネル毎にポートを分けました。

測定している様子。ch2は手で触っているので高めに出ています。


防水性能はまだ分かりません。今週末、晴れたら天気鍋で試してみます。

2026年7月26日日曜日

夏休みの自由研究:ソーラークッカー 天気鍋(トラブル発生)

太陽を追尾するターンテーブルの調整は、ぼほよくて12時間で180度回転しました。今日は朝のうち晴れたり曇ったりだったので、あまり期待しないでターンテーブルに載せた天気鍋の評価です。写真はまだ南東の方を向いています。これが徐々に南に向いていく。


途中で温度を見たら、温度ロガーが200℃を越えていておかしなことになっていました。センサが壊れた?かと思い、急遽外気を測定していた他方のセンサも鍋に入れて測定を継続。

結果、当初から鍋に入れていたセンサの温度はずっと異常(グラフ橙色)、もう一方も終盤になって異常値を記録するようになっていました。昼にそうめんを茹でるために鍋を回収したので今日の最高温度は66.7℃付近。十分熱くなっていてソーラークッカーはちゃんと働いています。

鍋からセンサを取り出してみると、レジンで固めたセンサが柔らかくなっていて水が進入した気がします。こんなになるのかとちょっと意外。調べてみると、一般的なレジンの耐熱温度は70~80℃らしい。これではダメですね。繰り返し70℃前後のお湯の温度を計っていたので徐々に劣化したのかと思う。


耐熱レジンで固めようかと思ってアマゾンで調べたら結構高い。それではと防水仕様になっているデジタルセンサを使うことにしました。小型の金属チューブに入ったケーブル一体型のセンサです。今までのセンサはアナログだったので、ESP32で書いたロガーのプログラムを変更する必要がありますが、大した手間ではないと期待。ただ、これまでの記録と差が生じる可能性もある。

週末にはロガーの改修ができるかと思っています。その後、快晴で暑くなってくれるとよいのですが。

2026年7月25日土曜日

夏休みの自由研究:ソーラークッカー 天気鍋(太陽追尾ターンテーブル)

久しぶりにArduinoで電子工作、と言っても工作全体から占める割合は僅か。

天気鍋で80℃のお湯を沸かすことを目指して、太陽を追尾するターンテーブルを作ってみました。動力は昔アマゾンで買った小型のギヤ付きステッピングモータ、これをArduino nanoで動かします。タイヤはミニ四駆のものでホイールは3Dプリントしたもの。モータの取り付け部品も3Dプリント。

テーブルは家にあったべニア板を丸く切り出して、写真のような回転ベアリングを使います。これで水2.5L+鍋+透明バケツ+反射板を支えられるハズ。


横から見た様子。タイヤを天板に押し付けるためにスプリングを使っています。当初このスプリングが強すぎてタイヤが回らなかったので、少し切って短くしました。


水2.5L入りの天気鍋を載せて動くか確認のためにモータを早く回しています。アニメーションGIFになっています。この重量が乗ってもちゃんと動きました。

太陽の動きに合わせてモータの回転速度を調整します。1時間で15度回転させればよいので、あらかじめ概算のパルス間隔を出しておきました。タイヤの直径、テーブルにタイヤが接する半径、ステップ数とギヤードモータの減速による回転数などから計算しました。

中心に分度器を置き、テーブルに接しないように差し金を渡して計測開始。


3時間後の様子です。45度になればよいのですが、50度くらいまで進んでしまいました。組み立て時にタイヤが接する位置がテーブルの中心に寄ったようです。

50/45=1.11倍進んだので、ステッピングモータのパルス間隔を1.11倍遅くして調整。


水を入れた天気鍋を載せて12時間のテスト開始です。明日の朝5:15頃に180度回っていれば調整完了です(最近5:00前に目が覚める)。バケツの向こうに差し金が立てあり目印にしています。それが反対側のバケツの取っ手に一致すれば180度です。


上手く行って、明日晴れたらこのターンテーブルに反射板と天気鍋を載せて評価してみます。

2026年7月20日月曜日

夏休みの自由研究:ソーラークッカー 天気鍋(75度超え)

関東地方も梅雨明けしましたね。朝から快晴で日差しが強い。天気鍋日和です。昨日作った太陽熱反射板 を使って天気鍋を試してみました。

いつもの場所はかみさんが布団を干してしまったので少し離れた地面の上。反射板を広げて、天気鍋を置きました。写真はお昼頃、透明バケツの蓋が結露していていい感じです。


温度を確認したら、なんと75.6度で目標の60度を大きく超えました。簡易的な反射板だけど効果は抜群です。


温度推移はこんな感じ。最高温度は75.7度でした。70度超えまで一気に上がっていて気持ち良い。この温度なら温泉卵が作れるかと鶏卵を2個投入したので温度が少し下がってしまいました。

今日のお昼は外食したので、そのまま実験を継続しています。夕方16:00頃に鍋をバケツごと部屋にいれたので温度が急に下がり始めています。お湯は夕飯のときに冷や麦を茹でるのに利用。温泉卵は温度が高すぎたのか、湯で時間が長すぎたのか普通のゆで卵になってしまった。


午前中、外気温が50度近くになっているのはセンサに直射日光が当たっていたため。気付いて日陰にいれたので徐々に下がっています。

75度を達成できたので欲が出てきました。次は途中で卵を入れたりせず、80度を狙いたく考えています。太陽を追尾するターンテーブルも作ってみようかと検討中。

2026年7月19日日曜日

夏休みの自由研究:ソーラークッカー 天気鍋(反射板製作)

午前中は時々雲がかかりましたが、いよいよ関東も梅雨明けかと思うような天気です。という訳でまた天気鍋(ソーラークッカー)を試してみました。夏休みの自由研究です。


今回は朝8:00前に開始しましたが、この時間はまだ直射日光が当たりません。グラフで水温が急に上がっている8:53頃から日光が当たってきたと思われます。その後、9:32頃から温度が下がっていますが、これはちょっとトラブってセンサが水から出てしまったため。その後は順調に水温があがり、今日45度まで達しました。目標は60度なのでまだまだ。

という訳で、太陽熱を集める反射板の製作です。この時期の昼頃の東京の太陽高度を調べてみると70度くらいなので、そのときに天気鍋に熱が集まるように設計。と、いうほどの設計ではない。

方眼厚紙を使って1/10スケールで試作してみました。真ん中の50円硬貨が天気鍋。


左右と後ろを折り曲げて、こんな感じになる予定。


家にあったプラダンを切り出しました。底は二重にしてあります。あまり意味はないかも。底から立ち上がるところは、幅広のセロハンテープヒンジ代わりにしています。下に写っているのが厚紙の1/10モデル。


両面テープで、キッチン用のアルミホイルを貼り付けました。


側面を立ち上げて両サイドを背面を洗濯ばさみで止めます。真ん中に天気鍋が置いてあります。アルミホイルに鍋が写っているので上手く太陽熱が鍋に当たりそう。左右は鈍角で、時間経過によって太陽の方向が変ってもある程度熱が集まることを期待。時間経過と共に回転するターンテーブルがあれば完璧。ギヤードステッピングモータとArduinoなどで簡単に作れそう。


明日、朝から晴れたら試してみる予定。さて、何度までいくか!?

2026年7月11日土曜日

梅雨明け間近、天気鍋を試す

今年の梅雨は梅雨らしい天候が続いて気温も低めでしたが、今週後半からようやく晴れ間がでるようになってきました。間もなく関東も梅雨明けでしょうか?暑くなりそうです。

今日は朝から晴れていたので 先日作った天気鍋 を試してみました。黒い鍋に水を2.5Lくらい入れて、反射が大きいステンレス製の鍋蓋はしないで、透明バケツに収めて日向に出します。繋がっているのは、昨年作った温度ロガー、これで水温を記録しました。

まだアルミホイルを使った反射板は用意できていません。次回測定時にまでには準備したい。写真を縦に通っている黒いのは散水ホース。


温度ロガー、Ch1が気温(右上にセンサが写っています)、Ch2が水温です。1分単位に記録しました。


朝は良く晴れていて直射日光が当たっていたのですが、次第に雲が流れてきて陽が陰ります。直射日光が当たっていた時間は感覚的に半分くらいでしょうか。

記録された温度の推移です。はじめは順調に上がっていますが段々とゆっくり上昇。このあたりは曇っていた時間が長かったと思う。最終的に40度を超えました。

外気を測定しているセンサにも直射日光が当たって温度が上がっています。日陰を作っておけばよかった。

試している間に、梅雨の間伸び放題となった雑草を抜いたり、枝葉の剪定などを行い久しぶりによい汗をかきました。で、お昼はこのお湯を沸かしてそうめんです。薬味はミョウガとシソの葉、「」ですね。

次はアルミホイルの反射板を用意して試してみます。60度くらいまで上がらないか期待しているのですが。

2026年6月28日日曜日

大人の遠足

大きな地震や梅雨の台風が続き、なんだか気分がすぐれません。頭痛もあって、これが気象病かと思うこの頃です。晴れないと鬱々してしまう。工作を行う気力も減退中。先日作ったソーラークッカー;天気鍋 も試せない。

そんな中、先週は気分転換に休みをとって東京の調布にある深大寺神代植物公園を訪ねてみました。名前はよく聞いていたけど初めての訪問。深大神代、読みは同じだけど漢字が違うのに気付いた。

深大寺の花手水、神代植物公園で育てた見ごろの花で飾っているそうです。家族の健康平安を願ってきました。


お昼は門前にある名物の深大寺そばを喫食。平日ですが門前のお店は結構込み合っています。意外と若い人も多い。インバウンドの外国人は見かけませんでした。

こちらは神代植物公園の紫陽花、アナベルです。公園は若い人は少なめで高齢者が多い感じ。

こちらは広大なバラ園、数えきれないほどの多種のバラが咲き誇っています。


大温室にあるベゴニアの部屋。この部屋が一番カラフルでした。


往きは京王線の調布駅からバスでしたが、帰りはバスで吉祥寺にでて、駅前と井の頭恩賜公園をぶらぶらしてみました。東京で育ちましたがここも初めて訪れました。どんだけ出不精なのか? 平日なのに大勢の人で賑わっていて、これが都会か。

以上、梅雨の合間の一日、大人の遠足でした。今週も天候がイマイチのようですが、なんとか乗り切りましょう。

2026年6月20日土曜日

ソーラークッカー(天気鍋)の製作

梅雨らしい天気が続きますね。週間天気予報をみるとこの週末も来週も雨模様。この雨が開けると暑い夏になりそうです。夏場は食欲も落ちて素麺冷や麦が多くなりがち。

そんなわけで麺を茹でるお湯を沸かすソーラーボイラーを作ってみました。かみさんいわく天気鍋。元々かみさんが昼食の麺を茹でるために、午前中に鍋に水をはって黒いビニール袋に包んで日向に出していたのです。その様子を見て、もう少し効率的にできないかと思っていた次第です。

まずは手ごろな黒い鍋を探すところから。IKEAのオンラインショップで見つけました。HEMLAGAD ヘムラーガッド 3L という鍋です。


中も黒いです。蓋も黒いのを探したのですが見つからず。


そのままでは空気の流れで冷めてしまうので、透明なケースに入れます。何かよいものはないかと探していたらアマゾンで以下のバケツを見つけました。釣りに使うのを目的としたバケツのようです。



素材は超透明PETとのこと。鍋がすっぽり収まります。


取っ手が収まるところを切り抜きます。後ろに写っている断熱材のスタイロフォームは、鍋の下に五徳のように置こうと思い切り出しましたが、最終的には使用せず。取っ手をバケツに引っ掻けるだけでも十分な強度がありそう。


超音波カッタで切り出しました。刃先は通常のカッタと同じなので通電してなくても切れます。過って手のひらを切って(刺して)しまった。痛い。


こんな感じで切り取りました。切り取った部分はあとで使うのでキープ。


鍋の取っ手の下側の形状に合わせてリュータで削ります。熱でPET樹脂が溶けていく感じで、溶けたものがこびり付くので最後に通常のカッタとヤスリで仕上げ。


こんな感じでバケツに鍋が収まりました。


このままでは取っ手の上の部分が開いているので、熱せられた空気が逃げていきます。そこで先ほど切り取った断片を蓋にテフロンのビスで取り付けました。これで側面も蓋ができます。


完成です。バケツの蓋だけで十分に密封できるので、鍋のステンレス蓋は無い方が太陽熱を吸収しやすいかもしれない。

そのあたり、次の晴れた週末に検証したいと思っています。

また、下記のソーラークッカーのように太陽熱を反射させて集熱するために、段ボールにアルミ箔を貼って周りに置いてみようかとも考えています。


エコかもしれないけど鍋やバケツ代を考えるとコスト的にはペイしないと思う。まあ、楽しみでやっていることなのでよいかな。