NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

JMS2023!(東)

japan-mobility-show2023 MAP

 先日息子とJMS2023に行って来ました(^^)/最後にTMS行ってから3年ぶりです
会場は大きく南、西、東に分かれていて、撮った写真も多いので南・西・東の3つに分けました。

1.南館

1.MITSUBISHI-FUSO
2-1.ダイハツ_OSANPO
2-2.ダイハツ_VISION-COPEN

3-1.トヨタ車体_X-VAN
3-2.トヨタ車体_GLOBAL HIACE BEV CONCEPT

3-3.トヨタ車体_RANGGA CONCEPT
4-1a.TOYOTA_IMV 0 半切りガシャポンマシンで限定ミニカー貰いました!!(^^)!
4-1b.TOYOTA_IMV 0 イベントVer!「?」BOXが良いですね(*'▽')

4-2.TOYOTA_FT-Se

4-3.TOYOTA_FT-3e

4-4.TOYOTA_イベント 有名な方でしょうか、( ゚Д゚)

4-5.TOYOTA_EPU EVコンセプト

4-6.TOYOTA_スペースモビリティ(プロトタイプ)これ欲しい(*'▽')
5.MAZDA_NAロードスター_時代を超えて映えますね(*^^)v
6.SUBARU_AIR MOBILITY CONCEPY 本当に飛ぶそうです( ゚Д゚)!

7-1.KAWASAKI_Ninja

7-2.KAWASAKI_Ninja7 Hybrid !!バイクで!

7-3.KAWASAKI_Ninjya ZX-4RR

7-4.KAWASAKI_KLX230 昔乗ってたKDX125思い出しました!コレ欲しい!(*'▽')

7-5.KAWASAKI_TERYX KRX4 1000

7-6.KAWASAKI_TESI H2 CARBON

8-1.HONDA_SUSTAINA-C/Pocket Concept、モトコンポ?…欲しい(*'▽')

8-2.HONDA_クロネコヤマト専用仕様N-VANでしょうか?

8-3.HONDA_KOMATSU PC 05E Electric ナニコレ普通に欲しい(*'▽')!
8-4.HONDA_ASIMO?的なロボット、アームがスケルトンでメカメカしい!良い!

8-5.HONDA_CI-MEV

8-6.HONDA_AMV 屋根無し軽トラ!

8-7.HONDA_***

8-8.HONDA_プロローグ(プロトタイプ)

8-9.HONDA_クルーズ・オリジン 無人タクシーだそうです

8-10.HONDA_プレリュード 本日のお目当て見れました!(*'▽')これ買いたい!

8-11.HONDA_Jet 陸海空制覇してますね!

9-1.YAMAHA_YZF-R125 普通に欲しい(;'∀')

9-2.YAMAHA_XSR125 私の教習車はXJR1200でした(*'▽')1/10!おもしろそう!

9-3.YAMAHA_MOTOROiD

9-4.YAMAHA_MOTOROiD2

9-5.YAMAHA_TY-E 2.2 電動トライアルマシン!

9-6.YAMAHA_TRICERA 三輪電動バイク

10-1.SUZUKI_MOQBA 一家に一台?いいかもしれませんね(*'▽')

10-2.SUZUKI_eWX

10-3.SUZUKI_eVX
10-4.SUZUKI_SWIFT Concept Sportが出るのは1年後でしょうか?"(-""-)"

10-5.ジムニー

11.MITSUBISHI_トライトン(L200)

12-1.BMW_X7

12-2.BMW_i7

2.まとめ

 私の物欲センサー順「ベスト10!」
①8-10.HONDA_プレリュード
②10-4.SUZUKI_SWIFT Concept →無いけどSportが有ったとしたら!
③9-1.YAMAHA_YZF-R125
④7-4.KAWASAKI_KLX230
⑤9-5.YAMAHA_TY-E 2.2
⑥8-3.HONDA_KOMATSU PC 05E Electric 
⑦8-1.HONDA_Pocket Concept
⑧10-1.SUZUKI_MOQBA
⑨4-6.トヨタ_スペースモビリティ
⑩4-2.トヨタ_FT-Se
※HONDAさん!プレリュード「6速マニュアル×ハイブリッド」出して頂ければCR-Zからスムーズに乗り換えられるのですが・・・(;'∀')お願いします!

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【Other】目次に戻る


JMS2023!(西)

japan-mobility-show2023 MAP

 先日息子とJMS2023に行って来ました(^^)/最後にTMS行ってから3年ぶりです
会場は大きく南、西、東に分かれていて、撮った写真も多いので南・西・東の3つに分けました。

1.西館

1-1.トヨタ紡織_ハイテクエアーシート?
1-2.トヨタ紡織_コンセプトモック・・・裏側(/ω\)
1-3.トヨタ紡織_MX PRIME
2-1.豊田合成_Flesby

3.BOSCH

4.AISIN

5.NSK

6.KOITO

7.TOYOTA LEXUS ROV CONCEPT
8.SUMITOMO ELECTRIC
9.Tokyo Future Tour

10.超小型モビリティ 遊園地に有ったら面白そうですね!
11.NISSAN_キャンピングカーでしょうか?アート作品かと思いました!( ゚Д゚)

12.トヨタ紡織

13.トヨタ_Astro e-Palette
14.JAXA 確かにこれもモビリティー(*^^)v

15.Joby_JAS4-1

15.デンソー_水素生成ブランコ!息子水素生成しました(^^)/
16.三精テクノロジーズ_SR-02 天神英貴氏デザインとの事(*'▽')

17.オリィ研究所_OriHime Porter TV番組で見ましたよ!(*^^)v

18-1.ロボットライド_スケルトニクス Net記事で見ました
18-2.ロボットライド_スケルトニクス 息子ハイタッチ!(^^)!
19-1.KAWASAKI_Kaleido メカメカしい!動いているところ見たかった( ;∀;)
19-2.KAWASAKI_K-RACER-X1(JX0169) 無人こぷたー!のマフラーがカッコいい(^^)/

20.FUNVE_PAC-MAN_ゲーセンに有ったら面白そう(^^)/

2.まとめ

 西館はTire1サプライヤーが工夫を凝らした展示をしており、見どころ満載でした!(^^)!

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【Other】目次に戻る


JMS2023!(南)

japan-mobility-show2023 MAP

 先日息子とJMS2023に行って来ました(^^)/最後にTMS行ってから3年ぶりです
会場は大きく南、西、東に分かれていて、撮った写真も多いので南・西・東の3つに分けました。

1.南館

 

1.TSUBAME ARCHAX01

2.AirX

3.トミカの山

4.フェラーリ***

5.フェラーリ***

6.ランボルギーニ***

7.ランボルギーニ***
8.AZ-1

9.総額5~6億円のケーニグセグ レゲーラ(;'∀')…、超カッコいいですね!

10.ポルシェ***

11.「キッザニア」40分/500円!予約なしで息子職業体験出来ました(*'▽')
12.半分クレイモック!のフェアレディZ!その場で削ってました( ゚Д゚)
13.フェラーリ 512BBi単体ギャラリー私1人、+美人の姉さん登場ギャラリー50人(*'▽')

14.Aston Martin ***

2.まとめ

 久しぶりの大きなイベントでした!コロナ自粛も解除されたって感じがして息子も楽しめた様で良かったです!(^^)!

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【Other】目次に戻る


スマホ(Pixcel4)電池交換!

上:2mm 両面接着ステッカーテープ、左:オープニングプライヤー、左下:Pixel 4、右:互換バッテリー+ツール

 ここ数年ほぼドラクエウォーク専用機と化している私のスマホPixcel4(2019年製)ですが、遂に異常発熱&バッテリー膨らみで裏蓋が持ち上がって来てしまいました( ;∀;)
 モノ持ちが異常に良い私としては「(*'▽')バッテリー交換すればいいんじゃね?」と言う事で自分で交換してみました(*^^)v

1.裏蓋を開ける

Pixcel4の裏蓋は接着剤で貼ってあるだけなので、以下の通り少しずつ引き剥がして開きます。一点注意事項として、裏蓋のカメラレンズ?とスマホ本体はフレキシブルケーブル(FPC)で繋がっているので、FPCを引きちぎらない様に注意しながら裏蓋を開けます。

1-1.裏蓋を止めている接着剤を少しずつ剥がし、

1-2.裏蓋OPEN! ※既にバッテリーが膨れて半開きになってましたので簡単に開きました

2.コネクタを抜く

以下2か所のコネクタを外します。

2-1.電源コネクタの、カバーを固定しているネジ5本外し、コネクタを抜き、
2-2.カメラコネクタ:カバーを固定しているネジ2本外し、コネクタを抜きます。

3.バッテリーを取り出す

以下の様にスマホ筐体からバッテリーを取り出します。

3-1.バッテリーと筐体を接着しているテープを剥がす
3-2.バッテリー接着をテコで少しずつ剥がす。

4.新バッテリー装着

旧バッテリーのバッテリー絶縁紙?を新バッテリーに移植した後、新バッテリーに両面テープを張り、それをスマホ筐体に装着します。

4-1.バッテリー絶縁紙を旧から新へ移植
4-2.新バッテリーに両面テープを貼り、

4-3.Pixcel4に新電池を収め貼り付けます。

5.接着材の張替え

2mm幅位の接着剤でスマホ裏蓋は固定されてます。一度古い接着剤を剥がした後、新しい接着剤(2mm幅両面テープ)を貼り付けます。

5-1.スマホ本体側と裏蓋側に残った古い接着剤をヘラで剥離し、
5-2.新しい両面テープを張ります。

6.コネクタを元に戻す

カメラコネクタと電源コネクタを以下手順で元に戻します。

6-1.カメラコネクタを付ける
6-2.電池コネクタを付ける

7.動作確認

貼り付ける前に一旦動作確認を行います。

7-1.一旦両面テープを貼り付ける前に蓋を閉じ、

7-2.電源ボタンを長押し後、スマホが起動する事を確認しておきます。(^^)/動いた!

8.裏蓋接着し電源ON!

最後に両面テープのマスキングを剥がして裏蓋を貼り付け、電源ON後起動する事を確認します。

8-1.最後に両面テープを剥がして裏蓋を閉じます
8-2.電源を投入し動作OK

8-3.完成!

9.まとめ

 あ。(;'∀')Pixcel4 OS updateは2022年10月にサポート期限終了!?との事…。一旦延命処置完了です(/ω\)

 

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る


 
 
 

WR250X (スターターリレー交換!)

WR250X(R)用 スターターリレーアセンブリ (RC19-076A) 品番 3D7-81940-00

 色々なバイクに23年以上乗ってますが、初めて「スターターリレー」なるものが壊れました( ;∀;)
 と言う事で自分でスターターリレーを交換しました(^^)/

1.確認①

バッテリー満充電・エンジンキーON・キルスイッチがリリースされている状態でセルを回すとスターターリレーが「カチッ」と音は鳴るのですがセルモーターが回らず暫くすると下図の様にエンジンエラーランプが点灯します。取り敢えずその状態でバイクを押し掛けするとエンジンは掛かるので点火系の故障ではなさそうです。

1.セルボタンを押すとエンジンエラーランプが点灯

2.シート&左サイドカバーを外す

スターターリレーにアクセスするには「シート」と「左サイドカバー」を以下の手順で外します。

2-1.スターターリレーにアクセスするには「シート」と「左サイドカバー」を外します

2-2. 8mmのソケットを付けたラチェットでシートを固定しているボルト2本を外し、

2-3. 5mmの六角レンチで左サイドカバーを固定しているボルト1本を外し、

2-4.シートはタンク上突起から、サイドカバーは写真中央ゴムパーツから抜き取ります。

2-5.バイクから「シート」と「左サイドカバー」が取れた状態

3.確認②

 セルモーターが壊れている可能性も有るので、以下手順で「スターターリレー」をバイパスしてエンジンが掛かるか確認した所、普通にエンジンが掛かりましたので「スターターリレー」の故障で確定ですね。

3-1.スターターリレーの電極間電圧は13.7Vなので、ここまで断線はしてなさそう。

3-2. 次に12V 50Aのブースターケーブルを用意し、そのうち1本(赤)を取り出し、
3-3. 「スターターリレーGND(黒線)側→スターターリレー+B(赤線)側」の順につなぐと、
普通にエンジンが掛かりました(^^)/セルモーターは生きている!

4.スターターリレー購入

近所のヤマハさんに行き「スターターリレーアッセンブリ(RC19-076A), 品番:3D7-81940-00」を見積もった所、「ボルト,フランジ, 品番:9502206008」も新品にした方が良いと言う事でお願いしました。因みにヤマハさんで部品を注文し、入荷後取りに行けば送料無料でした。

4-1. WR250X(R)用 スターターリレーアッセンブリ他一式見積もり:6,281円
4-2. 注文から4日でGET!
4-3. 新品のWR250X用スターターリレーアッセンブリ

5.スターターリレーを外す

 スターターリレー交換にはバッテリー端子を直接工具で触るので以下の通り注意して行います。

5-1. 写真中央「スターターリレー」
5-2.  8mmのソケットを付けたラチェットで「GND(黒線)側→+B(赤線)側」の順に外します。

5-3. 左:旧、右:新「スターターリレー」

6.スターターリレーを付ける

新品のスターターリレーをコネクターに接続し、バイク側に有るプラスティックのブラケットに差し込み端子をボルトで固定します。

6-1. スターターリレーをコネクターの爪が掛かる迄差し込み接続

6-2. バイク側プラスティックブラケットに差し込み&新品ボルト取り付け、
6-3. 最後に「+B(赤線)側→GND(黒線)側」の順に電源端子をボルトで固定します。

6-4. 「スターターリレー」接続完了!

7.エンジン始動!

カバーを戻す前にセルスターターボタンでエンジンが掛かるか確認します。

セルONでエンジン掛かりました!(^^)!

後は「2.シート&左サイドカバーを外す」の逆手順で元に戻して完成!

7.セルONでエンジンが掛かりました!

8.まとめ

 WR250Xのセルスターター交換は簡単ですね!(*'▽')流石オフ車モタード!

セルモーターが壊れてなくてよかった…(;'∀')セーフ

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る


 
 
 
 
 

グリーンカーテン(2023)!

グリーンカーテン2023!

 今年のグリーンカーテンは上出来で、他にも色々野菜を育ててみました(*^^)v

1.野菜色々

ゴーヤ以外の野菜たち。

左から:トマト(以下収穫:△)、ミニトマト(○)、唐辛子(×)

左から:万能ねぎ(◎)、なんとかレタス(〇)、ミニトマト(×)

オクラ(△)

奥:ブラックベリーの木(×…なぜか実が白く腐る?)

左から:メロン(?)、ナス(△)、ピーマン(△)、ローズマリー(?)、バジル(◎)、ナス(△)

2.グリーンカーテン(ゴーヤ)

今年のグリーンカーテンは過去一の葉っぱの茂り密度となりました!(^^)!

摘芯:今年は主な芽が葉っぱ8~10枚迄成長してから摘芯→脇芽が8~10枚迄成長してから摘芯しました。結果グリーンカーテンの密度は過去一になりましたが、ゴーヤの実は過去一小さく成りました(;'∀')実る数は多いのでヨシ!

ゴーヤ(表)

ゴーヤ(裏_摘芯有りVer)

種放置で成長したゴーヤ(摘芯無しVer)

今年は何故か白ゴーヤ?が出来ました( ゚Д゚)種類も見ずにゴーヤ買ってましたしね

3.グリーンカーテン(ゴーヤ)_改良点

今年のグリーンカーテンの改良点は他にも色々加えてます。

ゴーヤの肥料(有機合肥料8-8-8):一掴み/週・株

自動散水機のバッテリーが一年で死亡してたので新品に更新(´;ω;`)

自動散水機のホースを以下散水ノズル形状変更に伴い全て更新!(2日作業)

自動散水機からのホース分岐

新型散水ノズル!

4.自動散水機のプログラム

昨年までのプログラムでは、一時間に1回を超える散水設定ができず、8月の葉が成長した状態でお昼の猛暑を乗り越えられず葉がぐったりする状態を日々繰り返してました。 しかし今回の改良で以下の通り分単位で設定出来るようにし(設定上お昼は15分おきに散水)実は小さいですが元気なグリーンカーテンに育ってくれました!(^^)!2日位かけてメイン所はほぼ書き直し&デバッグ( ;∀;)

/* NOBのArduino日記! プランター自動水やり機制御プログラム(20230729更新)
 * rev   :2.01
 * 変更内容:ホース小径化に伴い吐出量減→対策として吐出回数倍増化
*/
#include "PlantWatering.h"
PlantWateringClass pwc;
int InComingData[255];
unsigned long StartTime, loopTime = 1000;
bool Skip = false, Skip2 = true;                       //条件判定
   unsigned long             On_No;                               //散水時間(単位:Sec)
   int WatTimParDay = 0;                                         //一日当たりの散水回数合計
   int OldMon = -1, OldDay = -1, OldHor = -1, OldMin = -1;//最終測定時間         




void setup() {
   Serial.begin(115200);
   pwc.RTC_time_initialize(false);
}


void loop() {
   //■main
   if (loopTime <= millis() - StartTime) {
       StartTime = millis();
       //■手動スイッチが押されていれば強制的に水を出す
       if(SkipCheck(false) && pwc.Switch_Read()){
           pwc.SolenoidWrite(true);
           SkipWrite(true);
       }

       //■規定時刻に土が乾いていれば水を出す
       if(SkipCheck(false) && Time_Read()){
           if(true/*Sensor_Read()*/){
               pwc.SolenoidWrite(true);
               SkipWrite(true);
           }
       }

       //■最後までSkipされていなければ水を止める、Skipトグルが「true」だったら「false」に戻す
       if(SkipCheck(false)){
           pwc.SolenoidWrite(false);
       }else{
           SkipWrite(false);
       }

       //■information出力
#if !DEBUG
           String str = "   WatTimParDay:" + String(WatTimParDay) + "   onNo:0x"+   String(On_No, HEX) + "\r\n";
           pwc.information_Print(str);
#endif
   }

#if DEBUG
   //■Debug[h,Yea, Mon, Day, Wee, Hor, Min, Sec,]: h2023,7,29,   06, 00,
   if (pwc.Receive(InComingData)) {
           pwc.ymd.Yea = InComingData[0];
           pwc.ymd.Mon = InComingData[1];
           pwc.ymd.Day = InComingData[2];
       //pwc.ymd.Wee = InComingData[3];   //省略
           pwc.ymd.Hor = InComingData[3];
           pwc.ymd.Min = InComingData[4];
       //pwc.ymd.Sec = InComingData[5];   //省略
           Time_Read();
           String str = "   WatTimParDay:" + String(WatTimParDay) + "   On_No:0x"+   String(On_No, HEX) + "\r\n";
           pwc.information_Print(str);
   }
#endif
}




/*
* リアルタイムクロックの値を判定
*/
bool Time_Read(){
   //No初期化
#if !DEBUG
   pwc.RTC_refresh();
#endif
   Skip2 = true;
   On_No = 0;
   if(pwc.ymd.Hor == 0 && pwc.ymd.Min == 0 && (OldMin != pwc.ymd.Min || OldHor != pwc.ymd.Hor || OldDay != pwc.ymd.Day || OldMon != pwc.ymd.Mon )){
       OldMin = pwc.ymd.Min;
       OldHor = pwc.ymd.Hor;
       OldDay = pwc.ymd.Day;
       OldMon = pwc.ymd.Mon;

#if false//DEBUG
               Serial.print(", WTPD:" + String(WatTimParDay));
#endif

       WatTimParDay = 0;
   };

   //規定時刻でtrueを返す処理
   switch (pwc.ymd.Mon) {
       case pwc.ymd.June:             //6月
           if(0 <= pwc.ymd.Day && pwc.ymd.Day < 7){
               // h2023,6,1,   06, 00,
               check( 6,   0, 0x060A0600);
               check(18,   0, 0x060A1800);
           } else if(7 <= pwc.ymd.Day && pwc.ymd.Day < 14){
               check( 6,   0, 0x060B0600);
               check(12,   0, 0x120B0600);
               check(18,   0, 0x180B0600);
           } else if(14 <= pwc.ymd.Day && pwc.ymd.Day < 21){
               check( 6,   0, 0x060C0600);
               check(10,   0, 0x060C1000);
               check(14,   0, 0x060C1400);
               check(18,   0, 0x060C1800);
           } else if(21 <= pwc.ymd.Day){
               check( 6,   0, 0x060D0600);
               check( 9,   0, 0x060D0900);
               check(12,   0, 0x060D1200);
               check(15,   0, 0x060D1500);
               check(18,   0, 0x060D1800);
           }
           break;
       case pwc.ymd.July:             //7月
           if(0 <= pwc.ymd.Day && pwc.ymd.Day < 7){
               check( 6,   0, 0x070A0600);
               check( 9,   0, 0x070A0900);
               check(12,   0, 0x070A1200);
               check(15,   0, 0x070A1500);
               check(18,   0, 0x070A1800);
           } else if(7 <= pwc.ymd.Day && pwc.ymd.Day < 14){
               check( 6,   0, 0x070B0600);
               check( 8,   0, 0x070B0800);
               check(10,   0, 0x070B1000);
               check(11,   0, 0x070B1100);
               check(12,   0, 0x070B1200);
               check(13,   0, 0x070B1300);
               check(14,   0, 0x070B1400);
               check(16,   0, 0x070B1600);
               check(18,   0, 0x070B1800);
           } else if(14 <= pwc.ymd.Day && pwc.ymd.Day < 21){
               check( 6,   0, 0x070C0600);
               check( 7,   0, 0x070C0700);
               check( 8,   0, 0x070C0800);
               check( 9,   0, 0x070C0900);
               check(10,   0, 0x070C1000);
               check(10, 30, 0x070C1030);
               check(11,   0, 0x070C1100);
               check(11, 30, 0x070C1130);
               check(12,   0, 0x070C1200);
               check(12, 30, 0x070C1230);
               check(13,   0, 0x070C1300);
               check(13, 30, 0x070C1330);
               check(14,   0, 0x070C1400);
               check(15,   0, 0x070C1500);
               check(16, 30, 0x070C1630);
               check(18,   0, 0x070C1800);
           } else if(21 <= pwc.ymd.Day){
               check( 6,   0, 0x070D0600);
               check( 7,   0, 0x070D0700);
               check( 8,   0, 0x070D0800);
               check( 9,   0, 0x070D0900);
               check( 9, 30, 0x070D0930);
               check(10,   0, 0x070D1000);
               check(10, 30, 0x070D1030);
               check(11,   0, 0x070D1100);
               check(11, 15, 0x070D1115);
               check(11, 30, 0x070D1130);
               check(11, 45, 0x070D1145);
               check(12,   0, 0x070D1200);
               check(12, 15, 0x070D1215);
               check(12, 30, 0x070D1230);
               check(12, 45, 0x070D1245);
               check(13,   0, 0x070D1300);
               check(13, 15, 0x070D1315);
               check(13, 30, 0x070D1330);
               check(13, 45, 0x070D1345);
               check(14,   0, 0x070D1400);
               check(15,   0, 0x070D1500);
               check(16,   0, 0x070D1600);
               check(17,   0, 0x070D1700);
               check(18,   0, 0x070D1800);
           }
           break;
       case pwc.ymd.August:         //8月
               check( 6,   0, 0x08ff0600);
               check( 7,   0, 0x08ff0700);
               check( 8,   0, 0x08ff0800);
               check( 9,   0, 0x08ff0900);
               check( 9, 30, 0x08ff0930);
               check(10,   0, 0x08ff1000);
               check(10, 30, 0x08ff1030);
               check(11,   0, 0x08ff1100);
               check(11, 15, 0x08ff1115);
               check(11, 30, 0x08ff1130);
               check(11, 45, 0x08ff1145);
               check(12,   0, 0x08ff1200);
               check(12, 15, 0x08ff1215);
               check(12, 30, 0x08ff1230);
               check(12, 45, 0x08ff1245);
               check(13,   0, 0x08ff1300);
               check(13, 15, 0x08ff1315);
               check(13, 30, 0x08ff1330);
               check(13, 45, 0x08ff1345);
               check(14,   0, 0x08ff1400);
               check(15,   0, 0x08ff1500);
               check(16,   0, 0x08ff1600);
               check(17,   0, 0x08ff1700);
               check(18,   0, 0x08ff1800);
           break;
       case pwc.ymd.September:   //9月
               check( 6,   0, 0x09ff0600);
               check( 7,   0, 0x09ff0700);
               check( 8,   0, 0x09ff0800);
               check( 9,   0, 0x09ff0900);                   
               check( 9, 30, 0x09ff0930);
               check(10,   0, 0x09ff1000);
               check(10, 30, 0x09ff1030);
               check(11,   0, 0x09ff1100);
               check(11, 15, 0x09ff1115);
               check(11, 30, 0x09ff1130);
               check(11, 45, 0x09ff1145);
               check(12,   0, 0x09ff1200);
               check(12, 15, 0x09ff1215);
               check(12, 30, 0x09ff1230);
               check(12, 45, 0x09ff1245);
               check(13,   0, 0x09ff1300);
               check(13, 15, 0x09ff1315);
               check(13, 30, 0x09ff1330);
               check(13, 45, 0x09ff1345);
               check(14,   0, 0x09ff1400);
               check(15,   0, 0x09ff1500);
               check(16,   0, 0x09ff1600);
               check(17,   0, 0x09ff1700);
               check(18,   0, 0x09ff1800);
           break;
       default:     //1~5月「Jan,Feb,Mar,Apr,May」、10~12月「Oct,Nov,Dec」)
               check( 6,   0, 0x09ff1500);
               check(18,   0, 0x09ff1600);
           break;
   }
   return (0 < On_No);   //OnTimeが0を超えたら「true」を返す
}




inline void SkipWrite( bool argV ){ Skip = argV; }




inline bool SkipCheck( bool argV ){
   if(Skip == argV){
       return true;
   }else{
       return false;
   };
}




/* 20230730 TBD 次回ここから修正する!!!!★★★!!!
* 引数の時刻である場合はTrueを返す関数
* 例: check(6, 0, 0x060A0600)
*/
inline void check(int hor, int min, unsigned long on_no){
   if(Skip2){
       if(pwc.ymd.Hor == hor && pwc.ymd.Min == min){
           On_No = on_no;
   #if false//DEBUG
                   Serial.print(
                       " now:" + (String)pwc.ymd.Mon +
                       ":" + (String)pwc.ymd.Day +
                       ":" + (String)pwc.ymd.Hor +
                       ":" + (String)pwc.ymd.Min +
                       ",   Old:" + (String)OldMon +
                       ":" + (String)OldDay +
                       ":" + (String)OldHor +
                       ":" + (String)OldMin +
                       "\r\n"
                       );
   #endif
           if(pwc.ymd.Min != OldMin || pwc.ymd.Hor != OldHor || pwc.ymd.Day != OldDay || pwc.ymd.Mon != OldMon){
               Skip2 = false;
               
               WatTimParDay++;
   #if false//DEBUG
                   Serial.print(
                       "   now:" + (String)pwc.ymd.Mon +
                       ":" + (String)pwc.ymd.Day +
                       ":" + (String)pwc.ymd.Hor +
                       ":" + (String)pwc.ymd.Min +
                       ",   chack:" + (String)hor +
                       ":" + (String)min +
                       ",   Old:" + (String)OldMon +
                       ":" + (String)OldDay +
                       ":" + (String)OldHor +
                       ":" + (String)OldMin +
                       ",   Skip2:" + (String)Skip2 +
                       ", WatTimParDay:" + (String)WatTimParDay +
                       ", On_No:0x" + String(On_No,HEX) +
                       "\r\n"
                       );
   #endif
           }
       }
       OldMin = pwc.ymd.Min;
       OldHor = pwc.ymd.Hor;
       OldDay = pwc.ymd.Day;
       OldMon = pwc.ymd.Mon;
   }
}

イメージ 1

自動散水機のプログラム(PlantWatering.ino)

#ifndef Arduino
   #include <Arduino.h>
#endif
#define DEBUG false
#include <Wire.h>
#include "DS1307.h"//https://github.com/Seeed-Studio/RTC_DS1307

class PlantWateringClass {
private:
   DS1307 clock;                                                         //DS1307Classのインスタンス生成
   const int SensorThreshold_Morning = 410;   //SensorReadの値が朝410を超えたら土に水をあげる
   const int SensorThreshold_Night     = 462;   //SensorReadの値が夜475を超えたら土に水をあげる
   const int Hor_Morning = 7;                               //朝一の時刻(閾値)
   int SensorPower = 2;                                           //土壌湿度センサー電力供給制御ピン番号
   int SolenoidPower = 8;                                       //水電磁弁開閉制御ピン番号
   int SwitchIn = A1;                                               //水電磁弁の手動ONスイッチ接続ピン番号
   int SensorIn = A3;                                               //土壌湿度センサー値取得ピン番号

public:
   typedef struct {
       //変数
       int Yea;
       int Mon;
       int Day;
       int Wee;
       int Hor;
       int Min;
       int Sec;
       //「曜日」列挙
       #ifndef MON //※「DS1307.h」「#define MON 1・・・SUN 7」迄既に定義されているので以下参考1
           enum WEE : byte {MON = 1, TUE, WED, THU, FRI, SAT, SUN};
       #endif
       //「月」列挙
       enum MONTH : byte {
           January = 1,
           February,
           March,
           April,
           May,
           June,
           July,
           August,
           September,
           October,
           November,
           December
       };
   } YMD; YMD ymd;


   /*
   * 時刻調整関数
   * 20190624:インターネット時間-3秒に調整済み
   * 通常の書き込み時は確実にDEBUG値を「false」にする!
   */
   void RTC_time_initialize(bool argV){
       if(argV){
           //                       年, 月, 日, 時, 分, 秒, 曜日
           //RTC_Write(2019,   7, 21, 12,   5,   0,   0);//前回
           //RTC_Write(2020,   6, 14,   6, 49, 55,   0);//書き込み後直ぐ出す_Test用
           //RTC_Write(2021,   6, 13, 15, 39,   0,   0);//20210614 いつでも値が確認できるようにDEBUGModeでシリアル出すが日付リセットは止めておく
           //RTC_Write(2022,   7, 2, 16, 47,   0,   0);//20220617 いつでも値が確認できるようにDEBUGModeでシリアル出すが日付リセットは止めておく
           RTC_Write(2023,   6, 25, 17, 47,   0,   0);//20230625 いつでも値が確認できるようにDEBUGModeでシリアル出すが日付リセットは止めておく
       }
   }


   PlantWateringClass(int _SensorPower=2, int _SolenoidPower=8, int _SwitchIn=A1, int _SensorIn=A3) {//PlantWateringClassのコンストラク
       SensorPower = _SensorPower;
       SolenoidPower = _SolenoidPower;
       SwitchIn = _SwitchIn;
       SensorIn = _SensorIn;
       pinMode(SensorPower, OUTPUT);
       pinMode(SolenoidPower, OUTPUT);
       pinMode(SwitchIn, INPUT);
       pinMode(SensorIn, INPUT);
       clock.begin();
   }


   inline void SolenoidWrite(bool argV){digitalWrite(SolenoidPower, argV);}; //TRUE:散水, FALSE:停止
   

   /*
   * 土壌湿度センサーの値を取得する
   */
   bool Sensor_Read(){
       int SensorValue = 0;                                                                   //SensorValueをint型の変数として宣言(毎回0にリセット)
       for(byte i=0;i<=10;i++){                                                           //A3ポートの電圧を10回読み平均値を出す
           digitalWrite(SensorPower, HIGH);                                       //センサー電力供給開始
           delay(10);                                                                                   //一定時間電流を流して測定値を安定させる
           SensorValue = SensorValue + analogRead(SensorIn);     //センサー電圧を読み合計する
           digitalWrite(SensorPower, LOW);                                         //センサー電力供給停止
       }
       SensorValue = SensorValue / 10;                                             //センサー電圧平均値を返す
       int SensorThreshold_Data;                                                         //朝晩によって閾値を変える
       if(ymd.Hor < Hor_Morning){ 
           SensorThreshold_Data = SensorThreshold_Morning;
       }else{
           SensorThreshold_Data = SensorThreshold_Night;
       }
       if(SensorValue > SensorThreshold_Data){                             //測定値が閾値より高い場合は1を返す
           return true;
       Serial.println("Senser_ON ");
       }else{
           return false;
       }
       Serial.println("Senser_OFF");
   }


   /*
   * 手動スイッチ入力状態の測定
   */
   bool Switch_Read(){
       if(digitalRead(SwitchIn) == HIGH){
           return true;
       }else{
           return false;
       }
   }


   /* 
   * Serial受信データ【例:h0,1,2,3CRLF】をintに変換しint配列に代入する関数
   */
   inline bool Receive(int* B) {
       int receive_bytes = Serial.available(), command_length;
       static String str_sum;
       unsigned   short get_byte_count;
       if (receive_bytes) {
           str_sum = str_sum + Serial.readStringUntil(0x0A);
           int hed_posi = str_sum.indexOf("h");
           if (hed_posi != -1){
               get_byte_count = str_sum.length();
               int lf_posi = get_byte_count;
               if (lf_posi == -1){
                   str_sum.remove(0, lf_posi);
               }else{
                   String str_command = str_sum.substring(0, lf_posi);
                   str_sum.remove(0, lf_posi + 1);
                   str_command.remove(lf_posi - 1);
                   str_command.remove(0, 1);
                   int k = 0;
                   int j = 0;
                   char text[256];
                   char delim = ',';
                   for (int i = 0; i <= str_command.length(); i++) {
                       char c = str_command.charAt(i);
                       if (c == delim || i == str_command.length()) {
                           text[k] = '\0';
                           B[j] = atoi(text);
                           j++;
                           k = 0;
                       } else {
                           text[k] = c;
                           k++;
                       }
                   }
                   return true;
               }
           }
       }
       return false;
   }


   /* 
   * RTCの時刻を修正する関数
   * 使い方           年, 月, 日, 時, 分, 秒, 曜日
   * RTC_Write(2019,   6, 24, 13, 51, 00, MON);
   */
   void RTC_Write(int Y,int M,int D,int h,int m,int s,int W){
       clock.fillByYMD(Y,M,D);   //年,月,日
       clock.fillByHMS(h,m,s);   //時:分,秒"
       clock.fillDayOfWeek(W);     //曜日
       clock.setTime();                     //RTCチップへの書き込み
   }

   /*
   * 現在の時刻を取得する
   */
   void RTC_refresh(){
       clock.getTime();
       ymd.Yea = clock.year + 2000;
       ymd.Mon = clock.month;
       ymd.Day = clock.dayOfMonth;
       ymd.Wee = clock.dayOfWeek;
       ymd.Hor = clock.hour;
       ymd.Min = clock.minute;
       ymd.Sec = clock.second;
   }


   /*
   * 現在のinformationを出力する
   */
   void information_Print(String str="\r\n"){
   //■Sencer_Print()
       Serial.flush();
       int SensorValue = 0;                                                                   //SensorValueをint型の変数として宣言(毎回0にリセット)
       for(byte i=0;i<=10;i++){                                                           //A3ポートの電圧を10回読み平均値を出す
           digitalWrite(SensorPower, HIGH);                                       //センサー電力供給開始
           delay(10);                                                                                   //一定時間電流を流して測定値を安定させる
           SensorValue = SensorValue + analogRead(SensorIn);     //センサー電圧を読み合計する
           digitalWrite(SensorPower, LOW);                                         //センサー電力供給停止
       }
       SensorValue = SensorValue / 10;                                             //センサー電圧平均値を返す
       Serial.print("Sensor:");Serial.print(SensorValue);Serial.print("   ");

       //■RTC_Print()
       Serial.flush();
       Serial.print(ymd.Yea, DEC);Serial.print("/");
       Serial.print(ymd.Mon, DEC);Serial.print("/");
       Serial.print(ymd.Day, DEC);
       switch (ymd.Wee){
           case MON:Serial.print("(MON)");break;
           case TUE:Serial.print("(TUE)");break;
           case WED:Serial.print("(WED)");break;
           case THU:Serial.print("(THU)");break;
           case FRI:Serial.print("(FRI)");break;
           case SAT:Serial.print("(SAT)");break;
           case SUN:Serial.print("(SUN)");break;
       }
       char Value[2];
       dtostrf(ymd.Hor,2,0,Value);Serial.print(Value);Serial.print(":");
       dtostrf(ymd.Min,2,0,Value);Serial.print(Value);Serial.print(":");
       dtostrf(ymd.Sec,2,0,Value);Serial.print(Value);

       //■出力状態も出力
       Serial.print("   Solenoid:");
       if(digitalRead(SolenoidPower)){Serial.print("ON");}else{Serial.print("OFF");} 

       //■その他information
       Serial.print(str);
   }
};



 /*
   * 機能:土壌湿度センサーの値を判定
   * Dry: (520 430]
   * Wet: (430 350]
   * Water: (350 260]
   * 
   * 土に直挿し実測値
   * 390:少し湿っている
   * 272:水没!
   * 337:水が滴っている
   * 
   * センサーの周りにスポンジセットし水散布
   * 一回目
   * 350:水あげ5min後
   * 425:水あげ10min後
   * 453:水あげ60min後
   * 
   * 二回目
   * 280:水あげ 0min後 13:09
   * 283:水あげ 1min後 13:10
   * 303:水あげ 2min後 13:11
   * 339:水あげ 3min後 13:12
   * 386:水あげ 4min後 13:13
   * 398:水あげ 5min後 13:14
   * 404:水あげ 6min後 13:15
   * 406:水あげ 7min後 13:16
   * 407:水あげ 8min後 13:17
   * 408:水あげ 9min後 13:18
   * 408:水あげ10min後 13:19
   * 409:水あげ11min後 13:20
   * 411:水あげ15min後 13:24
   * 415:水あげ20min後 13:29 水が滴っている
   * 415:水あげ25min後 13:34 水が滴っている
   * 417:水あげ30min後 13:39 水が滴っている
   * 423:水あげ50min後 13:59 水が滴っていない
   * 
   * 三回目(8/3 晴れ 11:08)
   * 443:水あげ4h後 乾燥している
   * 
   * 四回目(2023/6/25 晴れ 17:35,新)
   * 264:水あげ4h後 乾燥している
   */

イメージ 1

自動散水機のプログラム(PlantWatering.h)

5.まとめ

 今年は散水ノズル・散水プログラム等々を気合を入れて大幅改善した甲斐あって、グリーンカーテンとしては過去一の出来となりました!

 

■おまけ

 2015年から殺風景な庭の緑化を進めて来ましたが、8年越しで森感出て来たのではないでしょうか(*^^)v

左:before(2015/10/17)          右:after(2023/8/18)
左:before(2016/5/28)          右:after(2023/8/18)

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【プランター自動水やり機!(他ガーデニング)】目次に戻る


 
 
 

CR-Z(前回より真面目に塗装!)

CR-Z 研磨→パテ盛り→部分塗装!

 2022年1月16日の誤魔化し塗装から1年半経った現状が以下の通りです(´;ω;`)

1.現状

経年劣化したクリア塗装は一部剥がれると芋ずる式に剥がれていきますね(;'∀')

ダメージが無視できなくなってきましたので前回より真面目に塗装してみました。

クリア層が層間剝離状態で爪でべりべり剥がれます( ;∀;)

2.洗車

前回はパーツクリーナーで部分洗浄と横着しましたが、今回はしっかり洗車してから塗装します(;'∀')

洗車中

3.下地処理

近くのホームセンターで「マスカー」「マスカーカッター」「耐水ペーパー」「パテ」を買ってきました。

マスカー・マスカーカッター・耐水ペーパー・見えないがパテも有り
塗装したくない場所をマスキングします。

クリアが剥がれて段差になっているところを#400→#600→#800でペーパー掛け
SOFT99の「厚づけ&うすづけパテトライアルセット」でパテ盛り
#400→#600→#800→#1000でペーパー掛け
中性洗剤で洗車
拭き上げ後、水分が完全に乾燥するのを待ちます。

4.塗装

近くのカー用品店で、SOFT99 (99工房)の「 エアータッチ」、「仕上げスプレー」、「タッチアップペン H-76E NH642M ストームシルバーM」を買って来ました。

SOFT99は専用色が欲しい時に直ぐに買って来れるのが良いですね!
最初にソリッド色を3回位に分けて塗装し3時間位乾燥

最後に仕上げのクリア塗装を
数回に分けて塗装し完成!(^^)/

5まとめ

リアバンパー側の方がキレイに仕上がりました!(^^)!

Before!                    After!
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る