02/11/2018

Windows10 ユーザーアカウント制御されるアプリの自動起動方法

毎日定刻にPC(Windows10)を起動させ、その際に、アプリも自動起動させたい。ある設定した時刻になったら、PCをシャットダウンさせるという事をやりたかったのだが、ようやく上手く設定が出来たようなので、忘れないうちにここにメモをしておく。

僕が使っているPCの構成(monitorの仕様、BIOS設定方法など)の問題も有ったように思うので、そのシステムの概要をここに記載しておく。

《追記:2018/02/11》 自動起動させるProgramを変更したので、ここに、その際に行った情報を記載しておく。Program「UC.exe」はアンインストールして、機能が高いと思われる(Security Eyeという名前のソフト)Se.exeに変更してしまった。PCの起動とシャットダウンに関する基本的な部分は残っている所があるので、それを活かしながら変更を行った。後述の部分で、追記したところは
《追》を記載。


PCの概要

 Motherboard: Z97N-WiFi  LGA1150用 Mini-iTX (Gigabyte製)
 CPU: intel Core i5 4590 @3.30GHz BOX(Haswell Refresh)
 Memory: CORSAIR VENGEANCE 16.0GB
 Graphics: 内臓IGFX
 HardDisk: PLEXTOR 
 PC Case: Cooler Master  Elite 130 Cube
 電源: Enermax ELT500AWT  500W仕様
 OS: Windows10 Pro 64bit版

周辺装置

 Monitor: LG FLATRON IPS206T-PN  (DVI接続)
 Keyboard: FILCO Excellio FKB109EXJB
 Mouse: Microsoft  Mobile Optical Mouse (有線)

調べてみると、自動起動はBIOSの「RTCによる電源ON」から行い、シャットダウンは「タスクスケジューラ」から行えば良いらしい。

問題点は、
1)PC起動時にDelキーを押しても、BIOS画面を開くことが出来なかったこと。
2)BIOS画面を開くことが出来るように変更後、PCを起動後に、監視カメラ用アプリが連動して上手く立ち上がらなかったこと。
3)監視カメラ用のアプリは立ち上がったものの、ユーザーアカウント制御のために、アプリがそこで止まってしまうこと。
上記の問題は、下記のように設定して、問題が解消し、監視カメラ用アプリは自動的に起動した。

1)の問題は、僕が使っている自作PCを製作した際に選択したレガッシーBIOSの問題かもしれないし、あるいは、使っているモニターのPCとの接続仕様によるものかもしれない。
しかし、BIOSが表示できないという問題の原因は、どちらなのかを切り分ける事が出来ていない。

1.BIOS画面を表示するために、
 いろいろやっている間に、PCの起動ディスク(C:ドライブ)に余計な書き込みをしてしまい、PCが起動できなくなった。しかし、このような問題は起きてしまうものなので、事前にHDD(D:)の中には起動用のバックアップを作り、DVDにも起動用ディスクを作っておいた。

作業場所の問題があり、周辺機器(モニター、キーボード、マウス)を外して、このPCだけを別の部屋に移動させて設定作業を行った。

 ①PCからSSDを取り外して、別のPCに組み入れ、ここでSSDのパーティションを外し、初期状態にした。
 ②初期状態に戻したSSDを、再び元のPCに組み込み、マザーボード上のCMOSジャンパーピンをショートさせて、データをクリアし、周辺機器を接続して、電源ON。
 ③これで、電源ON直後に「Del」キーを押すことで、BIOS画面に入ることができた。

2.BIOS画面での設定
 BIOS画面を開いて、システム電源を計画的にONにする設定を行う。
 ①Power Management (電力管理) 画面で、Resume by Alarm(アラームで再開する)に入りを有効にして、
  Wake up hour と Wake up minute を設定した。
  僕は、午前4時30分にPCを起動させるようにしたいので、hourの入力は「4」を、minuteの入力は「30」とした。

  毎日同じ時刻に起動なので、Wake up day(開始日) は 「0」のままである。
  また、秒まで拘らないので、Wake up second(秒で起動) も 「0」のままである。

 ②予期せぬ停電などで、AC電源が失われた場合の電源復帰もここで設定しておく。
  僕は、Memory を選択し、AC電源が戻った際に、システムが停電する前の状態と同じ状態となるようにした。
  
 ③キーボードやマウスによる電源ONは不要なので、Disabledを選択した。

 ④「Save & Exit」を選択し、保存して終了! これで、PCの起動設定は出来たはずだ。
  
 ⑤設定の確認のため、ここで行っている他の設定準備が終わり、しばらく時間を置いた後に、
 例えば、10数分後にこのPCが自動起動するように、前述のResume by Alarmの時刻設定を行って、この状態を「Save & Exit」で保存しておくことにする。

 この確認作業が終われば、再びBIOS画面で起動させる時間を設定し直す必要がある。
 忘れないようにしないと・・・。

3.Windows10のパスワードなし起動
 僕は、「Windows 10で起動時のパスワード入力を省略する方法
」のURLを参考にさせていただいた。

4.スタートアップにアプリを登録する
 PCが起動したときに連動して自動起動させたいアプリは、スタートアップに入れれば良いらしい。
 ①アプリをスタートアップに登録するためには、登録するアプリをデスクトップ画面に仮置きする。
 注記)このとき、アプリのプロパティを開き、
  「互換性」のタグをクリックして、一番下にある「管理者としてこのプログラムを実行する」にチェックを入れてはいけない。これを行うと、アプリが起動しなくなる可能性が高い。

 ②Windowsボタンをマウス右クリックし、「ファイル名を指定して実行」メニューを選択する。
 ③開いた窓の中の枠内に 「shell:startup」 と入力し、「OK」をクリックする。

 ④新たに、エクスプローラーのスタートアップフォルダーが表示される。

  これまでに、アプリのスタートアップ登録をしていなければ、このフォルダーの中は空のはずだ。

 ⑤このスタートアップフォルダーに、デスクトップに仮置きしておいたアプリを、ドラックアンドドロップで移動させる。

 ⑥PCを再起動させる。

 この作業が完了すれば、監視カメラ用アプリはPC起動直後に起動するだろうと思っていた。
 アプリは起動したが、起動後『ユーザーアカウント制御(UAC)』という機能が働いて、「このアプリがPCに変更を加えることを許可しますか?」と聞いてくる! ここで「はい」と答える必要がないようにする必要がある。そうしないと、シャットダウンの時刻までアプリは止まったままである。

 それほど単純ではなかった。
まだ他の項目を設定する必要がある。

この課題を解消するためには、

5.まず、タスク スケジューラでタスクを作成する必要がある。
タスクスケジューラの起動は、タスクバーの「検索フォーム」に「task」と打ち込むと、表示される筈。メニューから「タスク スケジューラ」を選んでクリックする。

①画面右側の操作メニューから「タスクの作成・・・」を選び、

②開いた「タスクの作成」の窓の 全般タグ に、名前、説明を記入する。
 僕は、名前に「MotionDetectCamera」と記載し、説明は空欄とした。
 《追》今回はソフトウェアの名前「Security Eye」とし、
 ・ユーザーがログオンしているときのみ実行する・・・ボタンをON
 ・最上位の特権で実行する・・・・・・・・・・・・・にチェックを入れる。
 ・構成の枠内は、・・・・・・・・・・・・・・・・・Windows10を選択する。
 まだOKボタンはクリックしない。 

③操作タグ をクリックし、
 新規をクリックして新しい操作を作る。
 プログラムの開始を選んで、

 プログラム/スクリプト欄 には、
「参照」をクリックして、アプリが格納されている場所(例えば、C:\Program Files(x86)\Security Eye\) からプログラム (Se.exe) を探し場所を確認する。
 そして「C:\Program」とだけ入力する。《追》分割して入力するのだが、それらは内部で結合される。

 また、引数欄には、「Files(x86)\Security Eye\Se.exe」と入力する。
 僕は、開始(オプション)欄に 「/rl highest」と入力した。
 《追》「r」の次の文字は、半角縦線「|」である。

 OKをクリックして戻る。

④トリガータグ をクリックし、
 新規をクリック
 《追》タスクの開始で 「ログオン時」を選択し、
  次に、「特定のユーザーのボタン」を選択し、OKをクリックする。

⑤条件タグ をクリックし、
 入っているチェックをすべて外す。
 《追》「電源」の項目は、全てチェックを入れた。
 設定後、OKをクリックする。

注記)アプリケーションプログラム(ここでは”Se.exe”)は、ID、パスワードの入力無しで起動できるように設定しておくこと。

《追》これでもまだ「最上位の特権で実行する」が選択されているが、未だ『ユーザーアカウント制御(UAC)』で止められてしまう。

6.そのためユーザーアカウント制御の設定を変更する
先ず、モニター画面左下隅タスクバーの「検索フォーム」に「uac」と入力して、

「ユーザーアカウント制御設定の変更」をクリックし、「
ユーザーアカウント制御の設定」窓画面で、4段階の3段階目に設定してOKをクリックする。


7.最後に、PCをシャットダウンする設定を行う。

先程4.で設定したが、タスク スケジューラで、シャットダウン用のタスクを作成する必要がある。
タスク スケジューラの起動は、タスクバーの「検索フォーム」に「task」と打ち込むと、表示される筈。メニューから「タスク スケジューラ」を選んでクリックし起動させる。

①操作のタブをクリックし、今度は「基本タスクの作成」をクリックする。

②名前は、「自動シャットダウン」と付け、次へのボタンをクリックした。

③次の画面タスクトリガーでは、毎日のボタンを選択し、次へをクリックし、
  毎日の 開始時刻を設定する。
    僕は、当日の深夜「23:55:00」に設定し、次へのボタンをクリック。

  《追》タスクスケジューラライブラリーで、左右方向で中央列の上側の画面の中から
     「自動シャットダウン(自分が前回設定したタスク名)」を探し、マウス右クリック、
     メニュー画面からプロパティを選択し、クリックすると、編集画面が表示される。
     編集ボタンをクリックして、
      スケジュールに従うとし、毎日行うタスクの時間を編集する。

④操作の画面では、「プログラムの開始」ボタンを選択し、次へ。

  プログラム/スクリプトには、
   「 shutdown 」
  引数の追加には、
   「 /s /f 」
  と入力し、次へ。

⑤完了画面で、「完了」ボタンをクリックする。

以上で、全ての設定作業が完了したので、PCを再起動、又はシャットダウンした後PCの電源ボタンを押してみる・・・・・アプリは立ち上がったかな?

別のPCで確認した結果 この設定で無事立ち上がった!

アプリプログラムが上手く立ち上がらないので、ここでの設定に問題があるのかと思って色々調べた結果、アプリプログラムには、32bit版と64bit版の2種類があり、PCが64bit OSだったので64bit版のアプリを選んでインストールして確認しようとしていたが、何度やってもアプリの起動がおかしいので、32bit版にインストールし直して確認してみた。
電源ON後、ユーザーアカウント制御(UAC)も表示されずにパスし、アプリ(UC.exe)も起動し、画面表示された。

02/07/2018

Arduino NANO, DHT11 を使い、湿度によりPower制御する(その2)

Img_20180205_214956 Img_20180205_215141 Img_20180205_215301 前回の記事でトライアルが上手くいったので、ブレッドボードから基板に移して実用になるように進めてみた。




Img_20180207_091433 Img_20180207_092152 Img_20180207_092520 収納するケースは、百均ショップセリアでプラスチック製弁当箱を購入し、電源用とセンサー用にそれぞれ寸法を微調整しながら穴を空けて挿し込んだ。
電源は、中国製の5V2A仕様のものをAmazon経由で購入(@344円:SODIAL(R)AC 110-240VがDC 5Vに切り替え 電源コンバータ S-A10-05
)。ただし、Arduino NANOのVIN入力の仕様は7V~12Vだが、電圧調整ボリュームを一杯にしても6.3Vまでしか上げられなかった。しかし稼働できている。

Img_20180207_092458 Img_20180207_155332Photo 弁当箱ケースの蓋を閉じて、2x4用固定部品を利用して、取付けた。
ケース下側の線が、装置のArduinoなどに電力を供給し、右側のDHT11センサー(@152円:Rasbee デジタル 温湿度センサモジュール DHT11 5個入り760円
)により雰囲気湿度を計測し、ケース左上の電源コードのスイッチをON/OFFする。




02/04/2018

PCがネットに繋がらない・・・どうしたんだ!

今朝、メインPCを見るとネットに繋がらなくなっている。

早速、ネットワークのトラブルシューティングをすると・・・
Photo 「DNSサーバーに問題がある可能性があります」と表示される。(左の画像)


ネットにつながっているスマホで情報検索してみると、不具合項目の一つとして「プロバイダDNSサーバーの不具合の可能性がある」とのこと・・・ 
得られた情報から、DNSサーバーのアドレスを変更して見る事にした。



PCより、
スタートボタン上でマウス右クリックでメニューを表示し、

ネットワーク接続 ⇒ イーサネット ⇒ アダプターのオプションを変更する 
と辿り、イーサネットの一覧画面を表示する。

該当するイーサネットの上で、
マウス右クリックメニューからプロパティを選択。

次に、プロコトルバージョン4(TCP/IPv4)を選択して

プロパティボタンをクリックし、
「次のDNSサーバーのアドレスを使う」 にチェックを入れて(私のPCでは既にチェックが入っているが)、サーバーのアドレスを次の値に変更し、OKをクリック。
優先DNSサーバー 8.8.8.8
代替DNSサーバー 8.8.4.4

この後、PCを再起動したら・・・ ネットにつながった!
やれやれ・・・

02/03/2018

Arduino NANO, DHT11 を使い、湿度によりPower制御する

前回の回路を利用して、温度・湿度計測センサ「DHT11」で計測した環境湿度が30%よりも低下した場合に、リレーにより電源のSWをONにする装置のモデルを作成した。

前回に対して追加したのは、下記①~③
①パワーリレー
②パワーリレーを制御するための電源線と信号線(これはArduino NANOのD8ピンに接続した)
③パワースイッチの動作を確認するために、
  外部電源とLEDを組込んだ。
尚、私が前回使っていたブレッドボードでは、電源ラインに問題点がある事が判明したので、
OLEDディスプレイ周辺の回路は、別の新しいブレッドボードを使ってジャンパーピンの接続を簡素化した(見栄えを良くした)。

Fritzingを使って回路を描いてみた。
Dht11oled_displayrelay Img_20180203_203316PowerRelayの出力のところには、換気用ファン用の電源回路にすることになるが、ここでは論理が合っているか否かを確認するために、外部電源でLEDを点灯することとした。



拙宅では、衣類を入れるクローゼットに、換気ファンを設けたが、温度・湿度共に低い冬期でも常にファンが回るために、低い湿度の状況ではファンを停止したいと思った。それで、ファンをコントロールするための湿度はどれくらいに設定するのが良いか、調べてみると、「エコハウス・マニュアルノート・ページ
」 の中に下記の記事を見つけた。私は、室温に関わらず、ファンを制御する湿度を30%でやってみる事にした。

http://www.ecolab.or.jp/yumesekkei/note310.htmより引用
カビ発生の条件→
適度な湿度
カビは湿気を好みます。相対湿度77%~99%がカビにとって繁殖しやすい湿度といわれます。室内の湿気を40~60%に保っていても、風が通らず結露しやすい部屋の隅や押し入れ、温度の低い部屋などは湿度が高くなりやすく、カビが生えやすい場所です。


スケッチは下記のようになる。
《Sketch》

// DHT11センサーから湿度と温度を読み取り、PowerRelayを制御する

#include "DHT.h"
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

#define DHTPIN 2     // データピンをD2へ

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// DHT11の pin 1 (正面左側) NANOの +5Vへ
// DHT11の pin 2(正面左から2番目、データピン)NANOの D2 且つ 10kΩ経由で +5Vへ
// Connect pin 4 (正面右側) NANOの GNDへ

int powerSW   = 8;    // power SW

DHT dht(DHTPIN, DHTTYPE, 6);

char str[10];

void drawTest(void) {
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 5, 20, "Measurements");  // 画面表示が 2pixほど右にシフトしているため
}

void setup() {
  Serial.begin(9600); 
  Serial.println("DHT11 Measurements");
 
  dht.begin();
  u8g.firstPage();  
  do {
    drawTest();
  } while( u8g.nextPage() );

  pinMode(powerSW, OUTPUT);
  digitalWrite(powerSW, HIGH);  // power Off
  // Wait a few seconds.
  delay(2000);
}

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("DHTセンサからのデータ読取りに失敗しました!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");

  if ( h > 30.0 ) {
     digitalWrite(powerSW, LOW);  // power On
  } else {
     digitalWrite(powerSW,HIGH);  // power Off
  }
  
  // picture loop
  u8g.firstPage();  
  do {
    u8g.setFont(u8g_font_helvB08);

    u8g.drawStr( 5, 15, "Humidity:");
    u8g.drawStr( 80, 15, dtostrf(h, 5, 2, str));
    u8g.drawStr( 112, 15, "%");
    
    u8g.drawStr( 5, 30, "Temperature:");
    u8g.drawStr( 80, 30, dtostrf(t, 5, 2, str));
    u8g.drawStr( 112, 30, "\260C");
    
    u8g.drawStr( 80, 45, dtostrf(f, 5, 2, str));
    u8g.drawStr( 112, 45, "\260F");
    
    u8g.drawStr( 5, 60, "Heat index:");
    u8g.drawStr( 80, 60, dtostrf(hi, 5, 2, str));
    u8g.drawStr( 112, 60, "\260F");
    
  } while( u8g.nextPage() );

// Wait 30 seconds between measurements.
  delay(30000);
}

この結果を用いて、実用基板を起こしてみようと思う。

Arduino NANO-DHT11-OLED_Display を使って温度表示

Img_20180202_202410 Arduino NANODHT11を使って湿度と温度を計測し、それをOLEDディスプレイに表示する方法をメモしておく。
OLEDディスプレイへの表示は、Arduino Unoでは問題無く表示出来ていたのだが、中華製NANOでは表示できなかったので注意点を書いておく。
DHT11を使った湿度と温度の計測に関しては、数多くの記事をネット上に見る事が出来、私もその事例に倣ってブレッドボード上に組み立てた。


Img_20180202_203019 私が使ったOLEDディスプレイでは、Unoを使って組上げたものでは問題無く表示できるのに、同じように組み立てたNANOを使ったケースでは、全く表示出来なかった。(電源が入っていない感じ。)
電圧の違い(5V/3.3V)なのか、OLEDディスプレイ本体が壊れてしまったのか・・・と思ったり、ブレッドボード上でレイアウトやピン位置等、ジャンパーピンを何度も差し替え、長時間悩んだ。


ディスプレイの電源は、これまでNANOからブレッドボード上を経由して供給していたが、NANOのピン傍からジャンパーケーブルを使って直接OLEDディスプレイに接続してみたら、表示するようになった。ブレッドボード内に問題が有るのかな?これについては、未だ調査していない。ディスプレイの表示には、送り込んだデータが左に2pixほどずれて表示されるが、表示はするようになったので、部品異常では無いかもしれない。

(2018/02/03 20:13 OELDディスプレイに電源が入らない原因が分かった!

Img_20180203_200922 ブレッドボードには長手方向の途中で電源ラインが分断しているものが有って、そのためにOLEDディスプレイに電源が供給されなかったことが判明。僕はそこに目が行き届かなかった・・・。先ほど気づいたので、左に写真を添付しておく。写真の電源線の部分を見て欲しい。部品が乗ったブレッドボードの方では、赤と青の線が途中で切れている。)




OLEDディスプレイは5Vで動作し、SDA(A4ピンへ接続)、SCL(A5ピンへ接続)してI2Cインターフェースを介してNANOと通信する。

尚、私が参考にしたブログのURLは、
https://t93093.wordpress.com/2017/07/31/temperature-humidity-monitor-using-arduino-nano-dht11-0-96-inch-128x64-i2c-oled/


Dht11oled_display 回路は簡単なので、fritzingで描いて・・・、
sketch も下記に添付しておく。
ディスプレイ上で左側起点の最初の文字の表記位置を5pix分だけ右にシフトさせているが、これは画面表示が2pixほど左にずれて表示されるための私の暫定的な対応策である。



《sketch》

// DHT11センサーから湿度と温度を読み取り、128X64 I2C OLEDで表示する

#include "DHT.h"
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

#define DHTPIN 2     // データピンをD2へ

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// DHT11の pin 1 (正面左側) NANOの +5Vへ
// DHT11の pin 2(正面左から2番目、データピン)NANOの D2 且つ 10kΩ経由で +5Vへ
// Connect pin 4 (正面右側) NANOの GNDへ

DHT dht(DHTPIN, DHTTYPE, 6);

char str[10];

void drawTest(void) {
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 5, 20, "Measurements");  // 画面表示が 2pixほど右にシフトしているため
}

void setup() {
  Serial.begin(9600); 
  Serial.println("DHT11 test!");
 
  dht.begin();
  u8g.firstPage();  
  do {
    drawTest();
  } while( u8g.nextPage() );
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("DHTセンサからのデータ読取りに失敗しました!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");
  
  // picture loop
  u8g.firstPage();  
  do {
    u8g.setFont(u8g_font_helvB08);

    u8g.drawStr( 5, 15, "Humidity:");
    u8g.drawStr( 80, 15, dtostrf(h, 5, 2, str));
    u8g.drawStr( 112, 15, "%");
    
    u8g.drawStr( 5, 30, "Temperature:");
    u8g.drawStr( 80, 30, dtostrf(t, 5, 2, str));
    u8g.drawStr( 112, 30, "\260C");
    
    u8g.drawStr( 80, 45, dtostrf(f, 5, 2, str));
    u8g.drawStr( 112, 45, "\260F");
    
    u8g.drawStr( 5, 60, "Heat index:");
    u8g.drawStr( 80, 60, dtostrf(hi, 5, 2, str));
    u8g.drawStr( 112, 60, "\260F");
    
  } while( u8g.nextPage() );
}

12/19/2017

ドアフォンの故障(此方の声が相手に聞こえない)

Img_20171219_163241 拙宅で使っているドアフォン、最近訪問者の反応がおかしい・・・。宅配のお姉さんに聞くと、こちらの声が聞こえなかったと言っている。訪問者が押す「呼び鈴音」と「声」は、此方側親機のどの装置でも聞き取れているので、玄関の子機に問題があるようだと判断し、その子機を取外し、スピーカの抵抗をチェックしてみた・・・。




Img_20171219_162515 Img_20171219_162453Img_20171219_162545 スピーカー配線の片側の半田付けを外し、抵抗値を測ってみると・・・、断線している。
小直径のスピーカー、スピーカー型番は、「DAIN LOAD02」8Ωのものだが、調べてみると互換品「 東京コーン スピーカー 28mm 0.5W 8Ω S28G10K-15 」があることがわかった。







とにかく修理してみようと思い、アマゾンからその互換品を購入することにした。価格は送料込みで@1350円也! 他に、中国製で外径のみが少し小さい安価なスピーカも見つけたが、商品の到着までには10日ほど待つ必要があるので、数日で到着するだろう「東京コーンスピーカー」のものを買う事にした。

2日後、注文したスピーカが到着し、早速換装作業実施し、テスト・・・
Img_20171222_165001 Img_20171222_165505 Img_20171222_171548a








部屋の中からの声が玄関の子機で聞こえる! 修理完了。

12/06/2017

Bluetooth modules(HC-05、HC-06)のPairing設定

Bluetooth modules(HC-05、HC-06)が互いに通信するための条件設定は何かを調べてみたので、メモとして残しておく。
本件に関しては、「Arduinoを簡単にBluetooth無線化するHC-05/HC-06
」(2015年2月20日の記事)、「Connecting 2 Arduinos by Bluetooth using a HC-05 and a HC-06: Pair, Bind, and Link 」(2014年11月の英文記事)がとても参考になる。

Bluetooth module HC-05の特徴は、
 ・Bluetoothの親機としても使用できる。(マスターでもスレーブとしてでも使用できる。)
 ・通信はBluetoothで行うが、入出力端子はシリアルのRX/TXとなっているため、Arduinoのシリアル RX/TXに接続するだけで通常のSerial通信と変わらず使用できる。

Bluetooth module HC-06の特徴は、
 ・3.3Vデバイスなので、Arduinoと接続する際には、5V Tx信号を抵抗分圧で、3.3Vにレベルシフトする必要が有る。
 ・通常Arduinoとの接続時には、再起動される。
 ・HC-06は、他のBluetooth module とペアリングしていない場合、ATコマンドを受け入れる。
 ・ATコマンドは、シリアルモニタの下端にある窓の設定は、「改行なし(No line ending、キャリッジリターン (CR) とラインフィード (LF)が無い状態
)」とし、且つ 1秒以内に送信する必要が有り、この時間を越えるとコマンドは無視される。

 ・ディバイスの名前:HC-06
 ・Password: 1234(デフォルト)
 ・Baud: 9600baud(デフォルト)


Bluetooth module HC-05およびHC-06が相互に
通信するための設定手順

①両方のデバイスで同じボーレートを設定する。

  (例)HC-05およびHC-06で、ボーレートを9600に設定する。

②両方のデバイスで、パスワードが同じであることを確認する。

  (例)HC-05とHC-06のパスワードを同じにする。

③次に、HC-06のアドレスを見つける必要がある。

  HC-06のATコマンドでは、自分(HC-06)のアドレスを調べる事は出来ないので、
  Androidデバイスから、あるいはHC-05を使って調べる事が出来る。
  
  ここの手順は、
Connecting 2 Arduinos by Bluetooth using a HC-05 and a HC-06: Pair, Bind, and Link 」の『3. Find the address of the HC-06』 に詳しく記載されているので、ここを確認するのが良い。

  HC-05で行う場合、HC-05をATコマンドモードにして以下のように行う。

  a)以前にペアになったデバイスをすべて消去するために、
    AT+RMAAD

  b)HC-05をマスタモードにする。
    
AT+ROLE=1

  c)
HC-05をリセットする。
    AT+RESET

  ピン34をHIGHにして(ATコマンドモードにして)から

  d)HC-05を任意のデバイスに接続するように設定する

    AT+CMODE=0

  e)最大5台のデバイスを9秒間検索するを行う場合、下記のコマンドを入力する。
    AT+INQM=0,5,9

  f)SPPプロファイルを開始する。もしSPPが既にアクティブであれば、無視することができるエラー(17)が表示される。
    AT+INIT
  g)ここで、他のBluetoothデバイスを検索する。
    AT+INQ
   Bluetoothデバイスが複数ある場合には、上記の設定により、5台までのデバイスが表示される。
   AT+INQは3つの値を返します。
     最初の値はアドレスで、これがペアリングの為に必要な値です。
     2番目の値はデバイスのモード。
     3番目の値はRSSI信号の強さ。

④HC-05をHC-06とペアリングする。(所謂、電話番号の交換)
  ペアリングするには、AT+PAIR= <addr>、<timeout>コマンドを使用する。
  (例) "AT + PAIR = 3014,10,171179,9"(引用符なし)と入力する。

     上記の例で、HC
-05がHC-06と 9秒以内にペアリングできない場合、
     エラーメッセージが表示される。
     ペアリングが成功すると、「OK」が表示される。

HC-06をHC-05にのアドレスとしてバインド設定する。(所謂、通話すること)
  "AT + BIND = 3014,10,171179"を使用してバインドする

⑥ペアリングされた特定の1台のデバイスにのみ接続するようにHC-05を設定する。
   CMODEコマンド でこれを行う。
  
   "AT + CMODE = 1"

HC-06へのリンク(HC-05からリモートデバイスであるHC-06への接続)
  リンクコマンドAT + LINK = <addr>を使用する

  (例)前述からの流れで示すと・・・
   "AT + LINK = 3014,10,171179" として行う。

  すべてがうまくいけば、「OK」 の応答が得られる。


  HC-05のLEDは、毎秒1回点滅し、HC-06のLEDは点灯状態(点滅ではない)。
  これで、HC-05とHC-06が接続した。

  接続設定が完了すると、HC-05は電源を入れるたびに自動的にHC-06に接続する。


  接続が確立されると、HC-05は通信モードに切り替わる。



通信の確認
テストスケッチで(私のブログならばここを参考に)確認を行う。

①HC-05とHC-06が接続された2台のArduinoの電源を切る。


②先ず、
HC-06の電源を入れる。
  LEDは1秒間に5回点滅している筈で、これは、接続を待っているか、ペアになっていることを示す。

③次に、
HC-05の電源を入れる。
  最初にLEDが数回点滅し、その後、通常パターンの点滅に変わる。

④HC-06のLEDが常時点灯する(点滅はしない)。

⑤以上で、2台のモジュールが接続される。



シリアルモニタを開くと、入力したコマンド等は、もう一方のデバイス用のモニタに表示され、逆も同様に表示される。


モジュールの電源がONになるたびに、接続し直す必要がある。モジュール間で接続していないことがわかったら、Arduinoの電源を入れ直すこと。

場合によっては、HC-05が接続しようとしてスタックしていることがある。この場合、HC-05のLEDの状況は、下記のようである。


1)2秒間に3回の点滅をしている。

2)あるいは、1秒に2回点滅します。
これは通常、HC-05をリセットしないで HC-06の電源を切り再度ONにしたときに発生する。

12/04/2017

HC-06 Bluetooth module のATコマンド

HC-05のATコマンドモードは、HC-05のプッシュボタンを押しながらArduinoの電源を入れれば、ATモードになり、それをLEDの点滅間隔で確認することができるが、HC-06にはHC-05のようなプッシュボタンが無いので、ATモード動作をどうやって行い、確認することが出来るのか?
調べてみると、「AT Command Mode of HC-05 and HC-06 Bluetooth Module by sayem2603 in wireless」に記載があった。要約したものをメモしておく。

《HC-06とHC-05の違い等について》

 ①HC05は、マスターとスレーブの両方として機能し、HC-06は、
常にスレーブに設定されていて、スレーブとしてのみ機能する。

 ② HC-06モジュールは、他のデバイスとペアリング設定されていない場合は、常にATモードになっている。したがって、HC-05のようにATモードになっていることを確認する点滅は無い。モジュールの電源を入れると、即ATコマンドモードになっている。HC-06のデフォルト設定内容を変更するには、ATコマンドを渡せば設定を変更できる。
下記にHC-06用にスケッチを書いてみると・・・
 【HC-06用のスケッチ】

// Basic Bluetooth sketch HC-06
// HC-06 モジュールと繋いで、シリアルモニタを使った通信用スケッチ
//
// HC-06 を電源ONした直後のデフォルト値と注意点は、
//   電源ON直後は ATモード(LEDの点滅とは関係なし)
//  ボーレートは 9600
//  NL+CR をコマンドに追加しない事
//   コマンドは、ATに続けて打ち込めばよい(例:AT+VERSION )
//
#include <SoftwareSerial.h>
  SoftwareSerial BTserial(2, 3); // RX | TX
// HC-06 の TX は、Arduino の RX pin2(D2)に接続する。 
// HC-06 の RX は、Arduino の TX 分電圧をして pin3(D3)に接続する。
// 
void setup() 
{
    Serial.begin(9600);
    Serial.println("AT コマンド入力 :");
// HC-06 のデフォルトでのシリアル速度は、9600
    BTserial.begin(9600);
}
void loop()
{
// HC-06 からコマンドを読み続けて、Arduino のシリアルモニタに通信する
    if (BTserial.available())
    {  
        Serial.write(BTserial.read());
    }
 
    // Arduino のシリアルモニタからのデータを読み続け、HC-06に通信する
    if (Serial.available())
    {
        BTserial.write(Serial.read());
    }
}


 ③HC-06では、ATコマンド入力の終了文字を待たず、1秒後に入力した文字に応じて動作する。したがって、1秒以内にコマンド入力を完了できない場合は、入力が無視される。
また、入力した文字のフィードバック出力も無い。このため、AT以外のATコマンドが無視されたかのように振る舞うことになる。そのため、IDE標準のシリアルモニタではなく、「Tera Term」等、別のモニタを使い、必要なATコマンドをエディタで編集して作成したものをコピーし、モニタの入力部分に貼り付けるの
が良いらしい。

  例えば、
  「
AT+VERSION」をマウスの右クリックメニューからコピーし、Tera Termに貼り付ければ、+Version:<version number>として表示されるはず。

 ④HC-06は、③の動作をするため、
複数の文字のバッチ送信を可能にする端末ソフトウェア(Tera Term等)を使用する必要がある。

 ⑤arduinoシリアルモニタで、 "AT"(引用符なし)で「Enterキー」を押すと、 "OK"が表示されATモードを確認出来る。しかし、HC-05と異なり、デフォルトの名前やボーレートは表示されない。出来るのは、それらを変更することだけ。

 ⑥HC-06で使用できるATコマンドには制限があるので、HC-05よりも少ないらしい。
  ・AT
  ・AT+NAME
  ・AT+BAUD
  ・AT+PIN
  ・AT+VERSION
  ・AT+UART
  など

 ⑦また、HC-06のコマンド入力では、HC-05とは違って、デフォルトの名前やボーレートは表示されないが、それを変更する事は出来る。
  ・名前を「PROTOTYPE」に変更する場合には、
   AT+NAMEPROTOTYPE  と記載すること。NAMEとPROTOTYPEの間にはスペースを入れないこと。

  ・ボーレートを変更するには、 AT+BAUDX  と記載すること。
   ここで、X は 1から8迄の数値をとることができる。
    1 --
> 1200bps
    2 --> 2400bps
    3 --> 4800bps
    4 --> 9600bps
    5 --> 19200bps
    6 --> 38400bps
    7 --> 57600bps
    8 --> 115200bps

   もし、38400bpsに設定したければ、 
AT+BAUD6  とすればよい。 

  因みに、ATコマンドに対して HC-06の応答は、このようになる・・・

    ATコマンド    HC-06の応答
    AT                     ->  OK
    AT+VERSION   ->    OKLinvorV1.8
    AT+BAUD4       ->    OK9600
    AT+PIN1234     ->    OK1234

12/01/2017

カリンのエキスジャム

そろそろカリンの実が成る頃になった。JAでカリンが安価に売られていたので、カリンのエキスジャム(果肉を使わない)を作ることにした。
レシピは、ブログ『~野の花のように~「花梨のジャム 目がさめるようなルビー色』を参考にさせて貰った。


1)用意するもの
 ①カリンの実    1kg(JAで購入したが、3個で丁度1kgだった)
 ②グラニュー糖   500g
 ③水       1200ml

2)作り方
①カリンの実を4つに割る

Img_20171201_075812








②鍋に切ったカリンを種ごと入れ、1200mlの水を加えて、実が柔らかくなるまで煮込む
Img_20171201_080214








③弱火にして、ぐつぐつと煮込む・・・
Img_20171201_081917








④実が柔らかくなったら、鍋から実と種を取り出して、網などで濾す
Img_20171201_092056 Img_20171201_092110








⑤濾した煮汁にグラニュー糖500gr入れて煮込んでゆく
Img_20171201_092453 Img_20171201_094346_burst007








⑥ぐつぐつと弱火で煮込んで・・・ 
Img_20171201_110435 Img_20171201_113920煮込んでゆくと、
色は段々濃いルビー色に変わってゆく







完成  鍋の中の量は未だ多いので、使う分だけ取り分けてみた。
Img_20171201_171438

Arduino接続の HC-05 Bluetooth module をペアリングする方法

Arduino接続の HC-05 Bluetooth module をペアリングさせる方法について、Youtube「How to Pair HC-05 Bluetooth module」情報を文書化しておく。

準備するもの
①Arduino 2台(Master用とSlave用各1台)
②HC-05(Master用)x1、HC-05(Slave用)x1
Hc05








③ArduinoとHC-05を接続するジャンパーケーブル

手順の概要
①Slave用のHC-05の設定と、Slave用Bluetooth module アドレス取得
②Master用のHC-05の設定と、通信するBluetooth module のアドレス書込み
③Master用Bluetooth moduleをArduino に接続

具体的手順
1)ArduinoをUSB接続
(USB 2.0 Type-Bを挿し込んで電源ON)して、 IDEを起動
  ボード、プロセッサを確認して、Arduino に書き込み、
  USBケーブルを外す(USB 2.0 Type-Bを抜いて電源OFF)
Usb2






2)Slave用のHC-05に対して、Arduino と次のように接続する。
  (左側がBluetooth module で、右側がArduino (例えばUNO))

   STATEピン → 接続しないで開放のまま
   RXピン → RXピンへ
   TXピン → TXピンへ
   GNDピン → GNDピンへ
   +5Vピン → 5Vピンへ
   ENピン → 3.3Vピンへ

3)Slaveモード側の
HC-05の設定状態を確認・設定する作業を行う。
 ①HC-05のEN端子側にあるプッシュボタンを押したままの状態にして、

   USB 2.0 Type-B をArduino に挿し込んで電源ONする。

 ②HC-05は、約2秒間隔でLEDが点灯する。
   これで、ATモードが起動した。

  (HC-05のプッシュボタンを押さずにUSBを接続すると、HC-05は短い間隔でLED点滅する。この時のモードが、ペアリングモードである。)

  もし、プッシュボタンを押し込んだ状態にしてUSBを接続するのが難しければ、
   小型の「目玉クリップ」等でボタンを挟んで、ボタンが押された状態にして、
   USBケーブルをArduino に挿し込めばよい。

 ③Arduino IDE を起動させて

  ・ツール → シリアルモニタを起動させる。
  ・シリアルモニタ画面で、改行指示と通信速度を確認する。
   「CRおよびLF」「38400」にすること。

 ④シリアルモニタのコマンド入力部分に「AT」と入力して、「OK」の表示が出ればATモードになっている事が確認できる。
  ・Master/Slave の確認を行う。
   AT +ROLE?  とコマンド入力して、
    +ROLE:0  と応答があれば、Slave になっている。
    +ROLE:1  と応答があれば、Master になっているので、
   AT +ROLE=0 とコマンド入力し、Slave に変更する。

  ・次に、このBluetooth module のアドレスを表示させる。
   AT +ADDR?  とコマンド入力すると、アドレスが表示される。
   ( 例えば、XX:XX:XX のように表示される。)
  ・これをノートパッドなどに貼り付けて、「:」のところを「,」に編集する。

 ⑤ArduinoからUSBケーブルを外し、
   Slave用のBluetooth module もジャンパーケーブルから外す。

 ⑥Master用のBluetooth module をジャンパーケーブルに接続する。
   このとき、ジャンパーケーブルの接続ピン位置は2)と同じままで良い。

 ⑦
Bluetooth module のプッシュボタンを押した状態で、Arduino にUSBケーブルを接続(電源ON)し、ATコマンドモード起動する。

   ATコマンドモードにして行う事は、以下の3項目
    ・ROLE(役割)をMaster にすること。
    ・ペアリング接続先を1つにすること。
    ・Slave用module と接続するようにアドレスを設定すること。

   Arduinoに接続したBluetooth module をMaster 設定するには、
   前記の3項目の順に作業する。

 
ATコマンドで、先ず現在の役割設定を下記のようにして確認する。
   
 AT +ROLE?
    +ROLE:0   と表示されれば、Slave の設定になっている。

    この場合には、

    AT +ROLE=1   と打ち込んで、ROLEをMasterに設定する。

 ⑨ペアリングの為に、このSlaveのアドレスを調べる。
    AT +ADDR?  と打ち込み、表示されたアドレスをコピーして、ノートパッドなどに貼り付ける。
    ノートパッドの編集機能を使って、コピーしたアドレスの「:
(半角)」の部分を「,(半角)」に変更する(2箇所)。この編集したアドレス「XX,XX,XX」は、後(⑭)で使う。


 ⑩Arduino のUSB電源ケーブルを外し、
   Slave用のBluetooth module も外し、Master用のBluetooth module を接続する。
   この時のピン接続は、⑥と同じで良い。

 ⑪HC-05(
Bluetooth module)のプッシュボタンを押したまま、Arduino のUSB電源ケーブルを接続し、HC-05をATモードで起動させる。

 ⑫Arduino IDEのをシリアルモニタを起動し、ATモードでROLE をMaster に設定する。
   AT +ROLE?   先ず設定状況を確認し、(+ROLE:0  となっている筈なので、)

   AT +ROLE=1  と打ち込んで、Master に設定する。

 ⑬他のBluetooth とのコネクション(接続)モードを確認・設定する。
   AT +CMOD?   で現設定状態を確認して、
    +CMODE:0  ならば、1台のみに接続
    +CMODE:1  ならば、どのBluetooth Module とも接続できるモード

   ここでは、1台のみに接続したいので、+CMOD:0 としておきたい。

   AT +CMOD=0  と打ち込んで設定する。

 ⑭次に、接続するBluetooth module のアドレスを設定する。
   先ほどノートパッドを使って編集したアドレス「
XX,XX,XX」(=[address])をコピーして、


   AT +BIND=[address]  として設定する。


4)2台のArduinoが交信するための準備
 ①別のArduinoにHC-05(Bluetooth module)を接続する。

  (左側がBluetooth module で、右側がArduino (例えばUNO))

   STATEピン → 接続しないで開放のまま

   RXピン → TXピンへ
   TXピン → RXピンへ
   GNDピン → GNDピンへ
   +5Vピン → 5Vピンへ
   ENピン → 3.3Vピンへ

 ②Youtubeでは、これでHC-05を繋いだ2台のArduino が、互いに通信出来る筈・・・
   試してみたい。


参考:HC-06(ZS-040)をArduinoでATコマンド接続するには
  Martyn Currey「Arduino and HC-06 (ZS-040)


10/21/2017

Google スプレッドシートでスクレーピングのトライアル1

Googleスプレッドシートでは、Excelよりも簡単にWebスクレーピングが出来るらしいので、調べて、どのように実現出来るのかをテストしてみた。

Spread
   














①B3のセルに日本気象協会10日間天気予報のURL値を一つ書き込み、C7のセルからB3のアドレスを参照し、スクレーピングしてみた。
セル"C7"には、「 =IMPORTHTML(B3,"table",1) 」 と書き込めば、直ぐにデータをインポートし表示してくれる。(図の左側のデータ表示部分)ここで、
「 =IMPORTHTML(B3,"table",1) 」として表示してくれるのは、最初の5日分なので、残りの5日分(6日目から10日目まで)を表示させるには、最初の5日分の書き込みの邪魔にならない所のセル(表示させる左上隅になるセル)に「=IMPORTHTML(B3,"table",2) 」と記入し、日本気象協会10日間天気予報のURLの2番目に書かれているテーブルを読込み、ここに書き込む必要がある。

しかし、僕がExcelで行ったように、任意の数のURLデータが順番に並んでいるような場合には、そのURLが書かれたアドレスを参照・読込し、スクレーピングでデータをインポートして欲しい。

②B3のアドレス番号(3行目、2列目)を参照する方法は・・・、
セル"K7"にその方法を記載して試してみた。

セル"K7"には、「=IMPORTHTML(INDIRECT(ADDRESS(3,2)),"table",1) 」 と書き込めば、直ぐにデータをインポートし表示してくれた。(図の右側のデータ表示部分)

ADDRESS(3,2) の表記は、B3のアドレスを数値で参照する。
これだけでは、アドレスを指定するだけなので、INDIRECT関数を使って、そのアドレスに書かれたデータを表示させるようにしている。

結果は図のとおりである。

どちらの場合でも同じデータが表示された。

10/19/2017

複数訪問予定地の天気予報(3時間と10日間を組合せ)表示

複数の離れた場所の訪問予定地がある際に、天気予報はどうなるのか調べる事があるが、何回も天気予報情報を開いて調べ、何枚もプリントし、それらを並べて漸く、自分の行動予定に伴う天気の今後の状況が把握できる。
もう少し効率的に調べて表示したいものだと思い、Excelのスクレーピング技術で表示するようにしてみた。当初は10日間天気予報のデータだけで纏めていたが、最初の3日間なら、3時間天気予報のデータを使う事が出来るので、3時間天気予報と10日間天気予報を組合せて表示させるようにしてみた。
310
マクロの内容は殆ど同じではあるが、3時間天気予報と10日間天気予報では、記載方法が少し違っている部分を変更してやる必要がある。(左図で表示した結果サンプルでは、データの幅が広くて画面からはみ出し、この画面では残り2日分が表示出来ていない。)

なお、場所に関するデータ(図のA~B列)の作成方法は、10日間天気予報と同じとした。3時間天気予報の部分は内部処理で補っている。

作成したマクロを以下に表示する。変更した部分は、10日間天気予報で作成したマクロと比較すれば、容易に分かると思うが、マクロの中に若干のコメントも記載したので、興味がある方には参考になると思う。

Webを読み取りExcel内に書き写した部分は、マクロの最後の部分で消去しているので、この部分をコメント表示にすれば、どのような書き写しが行われたかが分かり、参考になると思う。

尚、Excelシート内にマクロを実行するボタンを作成しておけば、便利だと思う。

《注記》 2017/10/20: マクロの記述に間違いがあり、3時間天気予報が地域別で更新されなかったのを修正した。
3104上図では最初の3日間天気予報の表示が全て同じになってしまっているが、左の図では地域別に違った状況になっている。




《マクロ》

Sub WeatherScraper2()
'3時間天気予報と10日間天気予測を組み合わせ表示するようにした(2017/10/19)
 Dim i As Long, j As Long, k As Long, imax As Long
 Dim URL As String, URLSet As String
 Dim URL10days As String, URL3hours As String
 Dim charsell As String, dadd As String, sadd As String
 Dim nsell As Long, hnsel As Long
'雨の際のセルの色を付ける変数 rain 雨⇒20 雨天以外は色無し⇒0
 Dim rain As Integer
'雨量が多く設定色番号 rainhard  33 を使うときの雨量(現在設定は 2㎜以上)
 Dim rainhard As Integer
'qrainstr は降水量セルに書かれた文字、qrain は降水量
 Dim qrainstr As String, qrainnbr As String, qrain As Long

 rainhard = 2
' i: URLとして書かれた処理入力番号
 i = 1

'URLが書かれたセル内にデータがある間処理を続ける。
 Do Until Cells(i + 2, 2) = ""
 
'10days.htmlから3hours.htmlを作る
 URL10days = Range(Cells(i + 2, 2).Address)
 URL3hours = Replace(URL10days, "10days", "3hours")

'先ず3時間天気予報のURLをセットし、スクレーピングする。
 URLSet = "URL;" & URL3hours

 With ActiveSheet.QueryTables.Add(Connection:= _
        URLSet, _
        Destination:=Range(Cells(101, 61 + (i - 1) * 9).Address))
        .Name = "?kd=1&tm=d&vl=a&mk=1&p=1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
 End With
 
'不要な4日目以降のデータ領域を削除する。
 Range(Cells(155, 61 + (i - 1) * 9), Cells(240, 70 + (i - 1) * 9).Address).Delete

'次に10日間天気予報のURLをセットし、スクレーピングする。
'この際、.RefreshStyle は xlOverwriteCells とする。
 URLSet = "URL;" & URL10days
 
 With ActiveSheet.QueryTables.Add(Connection:= _
        URLSet, _
        Destination:=Range(Cells(155, 61 + (i - 1) * 9).Address))
        .Name = "?kd=1&tm=d&vl=a&mk=1&p=1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
 End With

'不要なデータ領域を削除する。少し大きめの領域を削除
 Range(Cells(229, 61 + (i - 1) * 9), Cells(250, 70 + (i - 1) * 9).Address).Delete

'WebからExcelに書き写した表データ部分から、
'新たな表作成に必要なデータ部分をピックアップしてC列から右側に表記する。

 If i = 1 Then
'先ず、日・曜日を転記する。日と曜日のデータは、61列156行目から
    For j = 1 To 3
      Cells(1, 3 + (j - 1) * 8) = Cells(156 + (j - 1) * 7, 61)
    Next j
    
    For j = 4 To 5
      Cells(1, 27 + (j - 4) * 4) = Cells(177 + (j - 4) * 7, 61)
    Next j
    
    For j = 6 To 10
      Cells(1, 35 + (j - 6) * 4) = Cells(194 + (j - 6) * 7, 61)
    Next j
    
'時間枠(3:00,6:00,9:00,12:00,15:00,18:00,21:00,24:00)を記載する。
'これらの値は数値なので、シリアル値に換算するため24で割る。
    For j = 1 To 3
        For k = 1 To 8
          Cells(2, 3 + (k - 1) + (j - 1) * 8) = Cells(104, 62 + (k - 1)) / 24
        Next k
    Next j
    
'次に時間枠(3:00,9:00,15:00,21:00)を転記する。
'ここは文字列なので、其のまま転記すればよい。
    For j = 4 To 10
        For k = 1 To 4
          Cells(2, 27 + (k - 1) + (j - 4) * 4) = Cells(180 + (k - 1), 61)
        Next k
    Next j
  
'日付と時刻を見やすくするため、セルの書式設定、セルの結合を行う。
    For j = 1 To 3
      Cells(1, 3 + (j - 1) * 8).NumberFormatLocal = "G/標準"
      Range(Cells(1, 3 + (j - 1) * 8), Cells(1, 10 + (j - 1) * 8)).Merge
      Range(Cells(1, 3 + (j - 1) * 8), Cells(1, 10 + (j - 1) * 8)).HorizontalAlignment = xlCenter
        For k = 1 To 8
          Cells(2, 3 + (k - 1) + (j - 1) * 8).NumberFormatLocal = "[h]:mm"
        Next k
    Next j

    For j = 4 To 10
      Cells(1, 27 + (j - 4) * 4).NumberFormatLocal = "G/標準"
      Range(Cells(1, 27 + (j - 4) * 4), Cells(1, 30 + 4 * (j - 4))).Merge
      Range(Cells(1, 27 + (j - 4) * 4), Cells(1, 30 + 4 * (j - 4))).HorizontalAlignment = xlCenter
        For k = 1 To 4
          Cells(2, 27 + (k - 1) + (j - 4) * 4).NumberFormatLocal = "hh:mm"
        Next k
    Next j
End If

'天気に対するコメントを転記する。
     For j = 1 To 3
         For k = 1 To 8
           sadd = Range(Cells(107 + (j - 1) * 18, 62 + (k - 1)+ (i - 1) * 9).Address)
           If InStr(sadd, "晴れ") > 0 Then
           rain = 0
           Else
           End If
           If InStr(sadd, "曇り") > 0 Then
           rain = 15
           Else
           End If

           If InStr(sadd, "雨") > 0 Then
           rain = 20
'降水量が書き込まれたセル[qrainstr]
'文字を数値[qrain]にして、rainhard 以上なら青い色を濃い青 33 にする。
           qrainstr = Range(Cells(112 + (j - 1) * 18, 62 + (k - 1) + (i - 1) * 9).Address)
           qrain = Val(qrainstr)
             If qrain > 0 Then
'「小雨」で、雨量が 0以上なら色は薄い水色(28)に設定する。
             rain = 28
             Else
             End If
             
             If qrain >= rainhard Then
'「小雨」で、雨量がここで設定した2mm以上なら色は濃い水色(33)に設定する。
             rain = 33
             Else
             End If
         Else
         End If
         
'セルに天気コメントを書き入れ、そのセルの色を付ける。
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 8) = sadd
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 8).Interior.ColorIndex = rain
         Next k
     Next j
     
'天気に対するコメント、データは62列より(晴れ、曇りなど)を転記する。
'ここからは、URLを読んだ数毎に、読込み列は+9する必要がある。
'Webから写し取ったセル内の天気コメントは、全て二重表現になるので、文字数を1/2にする。
     For j = 4 To 5
         For k = 1 To 4
           charsell = Range(Cells(180 + (k - 1) + (j - 4) * 7, 62 + (i - 1) * 9).Address)
'セル内の文字数を数える。
           nsell = Len(charsell)
'二重に書いているので数値を半分にする。
           hnsel = nsell / 2
'セル枠に書かれている文字の前半分
           sadd = Mid(charsell, 1, hnsel)

           If InStr(sadd, "晴れ") > 0 Then
           rain = 0
           Else
           End If
           If InStr(sadd, "曇り") > 0 Then
           rain = 15
           Else
           End If

           If InStr(sadd, "雨") > 0 Then
           rain = 20
'降水量が書き込まれたセル[qrainstr]には、文字形式で「2㎜」などと書かれている。
'全角1文字[㎜]の左側の文字を数値[qrain]にして、rainhard 以上なら青い色を濃い青 33 にする。
           qrainstr = Range(Cells(180 + (k - 1) + (j - 4) * 7, 65 + (i - 1) * 9).Address)
           qrainnbr = Left(qrainstr, InStr(qrainstr, "㎜") - 1)
           qrain = Val(qrainnbr)
             If qrain > 0 Then
'「小雨」で、雨量が 0以上なら色は薄い水色(28)に設定する。
             rain = 28
             Else
             End If
             
             If qrain >= rainhard Then
'「小雨」で、雨量がここで設定した2mm以上なら色は濃い水色(33)に設定する。
             rain = 33
             Else
             End If
         Else
         End If
         
'セルに天気コメントを書き入れ、そのセルの色を付ける。
         Cells(3 + (i - 1), 27 + (k - 1) + (j - 4) * 4) = sadd
         Cells(3 + (i - 1), 27 + (k - 1) + (j - 4) * 4).Interior.ColorIndex = rain
         Next k
     Next j

'6日目以降の処理は、1~5日目までの処理と同じだが、転記元の場所が違うので別処理とした
     For j = 6 To 10
         For k = 1 To 4
           charsell = Range(Cells(197 + (k - 1) + (j - 6) * 7, 62 + (i - 1) * 9).Address)
           nsell = Len(charsell)
           hnsel = nsell / 2
           sadd = Mid(charsell, 1, hnsel)
        
           If InStr(sadd, "晴れ") > 0 Then
           rain = 0
           Else
           End If
           If InStr(sadd, "曇り") > 0 Then
           rain = 15
           Else
           End If
         
           If InStr(sadd, "雨") > 0 Then
           rain = 20
           qrainstr = Range(Cells(197 + (k - 1) + (j - 6) * 7, 65 + (i - 1) * 9).Address)
           qrainnbr = Left(qrainstr, InStr(qrainstr, "㎜") - 1)
           qrain = Val(qrainnbr)
             If qrain > 0 Then

             rain = 28
             Else
             End If
             
             If qrain >= rainhard Then
             rain = 33
             Else
             End If
         Else
     End If
        
'セルに天気コメントを書き入れ、そのセルの色を付ける。
         Cells(3 + (i - 1), 35 + (k - 1) + (j - 6) * 4) = sadd
         Cells(3 + (i - 1), 35 + (k - 1) + (j - 6) * 4).Interior.ColorIndex = rain
         Next k
     Next j

'B列のデータが有る限り処理する為カウンターを1つ進めて、最初の処理点に戻す。
 i = i + 1
Loop

imax = i - 1

'表の幅をデータの文字長さに合わせて自動調整する。
'範囲は、C列からBB列まで
Range("C:BB").Columns.AutoFit

'表の罫線を引く。
'罫線を引く範囲は、C1から第54列の第(imax+2)行まで
Range(Cells(1, 1), Cells(imax + 2, 54)).Borders.LineStyle = xlContinuous

'セルの中のデータは幅方向の中央に置く
Range(Cells(1, 3), Cells(imax + 2, 54)).HorizontalAlignment = xlCenter

'直ぐに必要としないデータ領域を非表示にし、Webから写し取ったセル部分を削除する。
Columns("B").Hidden = True
Range(Columns(61), Columns(61 + 6 + imax * 7)).Delete

End Sub

10/17/2017

ロボットカーを作ろう・・・ 先ず外装部分を作ってみる

屋根裏や床下の自分が入っていけない場所の状況を把握したい・・・と思い、ロボットカーを作ってみようと思った。

以前、中国からシャシーを購入しようとしたが、2度ほどトラブルにあい、自分で全て企画してみることにした。

タミヤ製のギヤボックス等を使って、外装部分を組み立ててみた。プラモデルやキットでは無いので、オリジナルの形である。

未だ、完成していません。主にシャシー周りの外装が終了しただけです。全て頭の中で企画し、身の回りで見つけ、部品に加工出来そうなものを使って、手あたりばったり組立ていったオリジナル品です。

配線は、外装部品類がどのように配置出来るかが決まらないと出来ないので・・・これからになります。プログラムと合わせて配線を進めるので時間がかかりそうです。

コンピュータはRaspberryPi3とArduinoUnoの2台を搭載します。ヘッドライトも明るいものを2個装着します。前方にUSBカメラを搭載します。電池は18650タイプを4個搭載し、無線でコントロールする予定です。

全長約270mm、全幅約130mm、全高約115mmで、以外に重量があります。
果たして、動くまでゆくかどうか・・・配線と同時にプログラム開発もあり、動くまでには相当な時間がかかりそうです。

Img_20171017_204254 Img_20171017_204326 Img_20171017_204349 Img_20171017_204437

10/02/2017

大清水から尾瀬・燧ケ岳 日帰り登山

Gps2 2017/9/28日23:30、川越駅西口バス停より関越交通の夜行バスを使って、大清水に入り、翌日9月30日に燧ケ岳(柴安嵓、俎嵓、ミノブチ岳)を登ってきた。

天気は、ほぼ予報通りで、写真のように青空も見えて良い天気であった。
燧ヶ岳への登山道は、ぬかるみの多い湿地帯の中を歩いて居るような道で、歩行は決して快適では無かった。僕は、ゴム長靴を履いていたので、足元の泥による汚れは何も気にすることなく歩くことが出来た。


燧ケ岳に登る 3合目を過ぎた辺りで、同じルートを歩いて居る若い女性に出会った。僕は疲れ始めて歩行速度も落ちてきていたので、彼女と雑談をしながら柴安嵓まで一緒に登ることが出来た。連れが居ると、疲れは一時的にでも忘れる事が出来る。彼女は休暇をとって友人と尾瀬に来て、確か長蔵小屋に泊まり、早朝より燧ヶ岳を目指して歩いてきたとのこと。友人は、尾瀬ヶ原を歩きに行ったそうだ。其々、別の尾瀬の楽しみ方をしている!柴安嵓を登った後は、赤田代にある温泉小屋に泊まり、尾瀬を満喫して帰るとの事だった。僕は熊沢田代の景色を見たいので、柴安嵓で記念写真を撮って貰い別れたが、とても感じの良い人だった。

熊沢田代の景色は、私のお気に入りの場所である。ここは、俎嵓側から見ても良いし、2つの池塘の先から振り返って燧ケ岳方向を見ても良い景色だと僕は思っている。今回は草紅葉が綺麗な色を放ち、また2つの池塘は、空の青を映し、綺麗な色の対比を見せてくれた。この場所を撮影した多くの風景写真でも、この日のように池塘が青く見えているものは殆ど無かったのではないかと思った。

熊沢田代を過ぎた登り階段で、急に右足の大腿四頭筋が攣ってしまった。脚を揉み解し、水分を補給して少し休んで、痛みを感じながら速度を落として暫く歩くと、痛みは徐々に引いて行った。しかし、ここから御池に下りるまでは、急で滑りやすい下り勾配が続く・・・。この燧ケ岳の山道の中では、一番嫌いな場所になる。神経を集中させながら慎重に下山した。
濡れていて段差も大きく、小さな岩も多く滑りやすく感じたが、硬めのインソールを中に入れたゴム長靴は、僕が普段使っている硬めのソールの登山靴より滑りにくいと思ったし、28kmも歩いて足に水膨れが出来なかった事には正直驚いた。

御池から七入へ下るところの「ブナ平」は、残念ながら未だ紅葉に至らず・・・紅葉までにはまだしばらく時間がかかりそうに思えた。僕は、緑に囲まれた古道の中を七入バス停に向かって下りたが、途中で急な階段を下りるところがあり、膝がまた攣るのではないかと心配になって、一般道を歩いてしまった。後から考えれば、ゆっくりした速度でも良いから、階段を下りていれば、七入バス停で当初予定通りのバスに乗れた可能性が高いと僕は思っている。

七入バス停への到着時間が、バス停車時刻の3分後になり、約1時間半後のバスを待たざるを得なくなった。何もない「七入バス停」で時間を潰すのは面白く無いので、キリンテ登山口の近くにあるバス停まで歩くことにした。そのバス停の傍には「みやまえ食堂」があるので、早めの夕食を摂ってバスの到着までその場所で待たせて戴こうという計画だ。食堂では、この地方の名物蕎麦「裁ち蕎麦」の大盛りを食べて、会津高原尾瀬口方面行き最終バスに乗った。(この食堂、34年前から開業してきたが、今秋10月24日で営業終了との事。何とも寂しくとても残念である。)

七入で乗車すべきバスに乗り遅れて、帰宅のスタート時刻は、1時間半遅くなったが、
特急電車に乗車できた為、自宅到着は、当初予定に対し30分の遅れとなった。

歩行距離と時間:

 持参した
GarminのGPS eTrex30(現在では旧型、後継機種としてeTrex30xがあるらしい)に依れば、歩いたルート(上記地図上で水色の線で示したルート)の歩行距離は 27.8km、所要時間は11時間30分であった。

 詳細は次のようであった。
Photo




 [04:15]04:07 大清水バス停
     04:51 一ノ瀬休憩所  小休止
     05:25 岩清水
 [06:20]05:54 三平峠
 [06:35]06:13 三平下(尾瀬沼山荘)
      ここでトイレ休憩
     06:41 尾瀬沼ビジターセンター
      ここで、朝食・トイレ休憩  (気温は 2℃)
            07:10 長英新道分岐
            07:44 一合目(h=約1745m、標高値はGPS表示値を使った。下記同様)
            08:01 二合目(h=約1810m)
            08:18 三合目(h=約1890m)
            08:34 四合目(h=約1960m)
            08:45 五合目(h=約2020m)
            08:56 六合目(h=約2085m)

            09:20 ミノブチ岳(h=約2213m)  小休止 約7分間
            09:34 八合目(h=約2235m)
            09:46 九合目(h=約2290m)
 [09:55]09:57 俎嵓(まないたぐら、h=2346m)  小休止 約15分間
 [10:20]10:36 柴安嵓(しばやすぐら、h=2356m)  小休止 約6分間
 [10:45]11:04 俎嵓           小休止 約13分間
 [11:45]12:04 熊沢田代
 [12:25]12:49 広沢田代
 [13:05]13:36 御池(みいけ)
 [14:40]14:59 七入(バス停)
     15:35 みやいり食堂(キリンテ登山口の少し北側に位置)
           七入~みやいり食堂:距離約 2.7km(約36分)

 大清水から御池までのルートは、事前にヤマケイオンラインを使って、コースタイムと登山計画書を作成しておいたので、その時の計画時刻を[ ]内に記載しておく。コースタイム倍率は1.00倍である。七入(バス停)の[ ]内時刻は、私が計画した到着時刻。

帰宅アクセス概要

 みやまえ食堂(2017年10月24日で閉店とのこと)前のキリンテバス停から
16:30頃 バス乗車(
みやまえ食堂前のキリンテバス停定刻より少し遅れていた・・・)
17:50頃 会津高原尾瀬口着
18:11 会津高原尾瀬口発(野岩鉄道特急リバティ会津148号浅草行き 指定席@1600円)
20:41 春日部着
20:45 春日部発(東武アーバンパークライン・大宮行き、8番線より)
21:07 大宮着
21:23 大宮発(JR埼京線通勤快速・川越行き)
21:46 川越着

事前の天気確認:

 僕は、下記の予報を調べて決行した。
 ①「てんきとくらす 燧ケ岳」、「10日間天気予報 尾瀬
 ②weather2"Oze-Tokura"

10月1日(日曜日)、「
ロングウォークちちぶ路」のイベントが計画されており、今年は是非参加したいと思っていたのだが・・・、階段を降りる時に大腿四頭筋だけがまだ少し痛むため、出席を取りやめてこのブログを書いている。
10月2日(月曜日)、脚の筋肉痛はすっかり治まった。

持参した道具など
①靴:ビバホームオリジナルのゴム長靴の中にSuperfeetのインソール(GREEN)を入れた。
②バックパック: Millet SAAS Fee2 30(L)
③上着:長袖Tシャツ、Arc'teryx Gamma LT Jacket、
防寒用薄手のダウンジャケット、
  着替え用:長袖Tシャツx1(使用せず)、登山用靴下x1
(使用せず)
④ズボン:替えなし。
⑤雨具: ゴアテックスの上着のみ持参したが使用せず。
⑥水: 500mlx 4本 ⇒ 使ったのは 2本半
⑦食料: 朝食用として「サンドウィッチ」、昼食用として「おにぎり」x 2個
⑧非常食: アンパンx1、ウイダーinゼリー エネルギーx1、アーモンドチョコレート
⑨ストック: LEKI Quantum
⑩ヘッドライト: Black Diamond ストーム 単4x4 (予備電池:単4x4)
⑪帽子:x1
⑫熊よけ:熊鈴、熊撃退スプレー
⑬カメラ: Nikon D800 & AF-S Nikkor 24-120mm
⑭財布:
⑮ファーストエイドセット: 常備薬、胃腸薬、バンドエイド等
⑯フェースタオル: 1本
⑰サングラス:x1
⑱手袋:x1
⑲GPS: Garmin eTrex30 (地図は、UUD製 Japan Digital Road Map Navigator and Topo 10m for Garmin GPS V5)
⑳トラベル用首枕:x1 (100均ショップ)


《写真》 撮影した写真を下記に、時系列的に並べた。
Dsc_7744 Dsc_7752Dsc_7759 Dsc_7765Dsc_7766 Dsc_7769Dsc_7846 Dsc_7774 Dsc_7780






Dsc_7784 Dsc_7791
 Dsc_7792Dsc_7794






Dsc_7809Dsc_7813Dsc_7815Dsc_7818Dsc_7736Dsc_7738












Dsc_7819 Dsc_7845 Dsc_7854Dsc_7866Dsc_7870Dsc_7881Dsc_7885_stitchDsc_7896Dsc_7903Dsc_7913Dsc_7924Dsc_7927Dsc_7931Dsc_7951Dsc_7971Dsc_7986Dsc_7996Dsc_8000_stitchDsc_7998 Dsc_8009Dsc_8028Dsc_8043Dsc_8045Dsc_8052Dsc_8055Dsc_8086 Dsc_8068Dsc_8077Dsc_8096Dsc_8137Dsc_8153Dsc_8162Dsc_8171Dsc_8175Dsc_8187Dsc_8195Dsc_8205Dsc_8208Dsc_8211Dsc_8214Dsc_8225Dsc_8242Dsc_8271Dsc_8275Dsc_8284 Dsc_8295Img_20170929_162153Img_20170929_155147Img_20170929_163009
























































































《歩行ルートデータ》
「track__29_sep_2017_oze_hiuchi_mountain.gpx」をダウンロード

09/30/2017

Webの10日間天気予報をExcelに書き写し編集する

日本気象協会の10日間天気予報のWebページのデータを写し取り、複数の場所のURLデータを一覧にして、天気の状況の変化をみるための処理を行う。Webページの表現方法が変更になって、以前作成したマクロでは処理が出来なくなっていたので見直す事にした。しばらくぶりに見るマクロで、処理をどのように書いていたか、思い出すのに一苦労した。

データ処理のマクロは、下記のようになる。
Webデータを書き写す際の間違いに気づいたので、今回はここも修正した。

「日本気象協会の10日間天気予報」を活用した、以前僕が発表したマクロは、今回発表のマクロ(下記)に変更して欲しい。

《注記》下記マクロの第80,84行目にCell位置指示の間違いが有ったので修正した。(2017/10/04)

《マクロ部分》

Sub WeatherScraper()
'URL内の記載状況が変わったため、マクロを見直し新バージョンとして作成(2017/09/28)
 Dim i As Long, j As Long, k As Long, imax As Long
 Dim URL As String, URLSet As String
 Dim charsell As String, dadd As String, sadd As String
 Dim nsell As Long, hnsel As Long
'雨の際のセルの色を付けるため 雨⇒20 雨天以外は色無し⇒0
 Dim rain As Integer
'雨量が多く設定色番号 33 を使うときの雨量(現在設定は 2㎜以上)
 Dim rainhard As Integer
'qrainstr は降水量セルに書かれた文字、qrain は降水量
 Dim qrainstr As String, qrainnbr As String, qrain As Long

'多降水量設定にする数値 僕は2mmとした。
 rainhard = 2
' i: URLとして書かれた処理入力番号
 i = 1

'URLが書かれたセル内にデータがある間処理を続ける。
 Do Until Cells(i + 2, 2) = ""

'URLの読み込み位置にデータが存在しているので、天気予報のURLをセットする。
 URLSet = "URL;" & Range(Cells(i + 2, 2).Address)

'WebからExcelシート内にデータを書き写す位置の記載方法が間違っていたので
'Destinationの中の表現を修正した。
 With ActiveSheet.QueryTables.Add(Connection:= _
        URLSet, _
        Destination:=Range(Cells(101, 53 + (i - 1) * 7).Address))
        .Name = "?kd=1&tm=d&vl=a&mk=1&p=1&quot;
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
 End With

'WebからExcelに書き写した表データ部分から、
'新たな表作成に必要なデータ部分をピックアップしてC列から右側に表記する。
 If i = 1 Then
'先ず、日・曜日を転記する。日と曜日のデータは、"BA"列に書き写してあり、
' 102,109,116,123,130,  140,147,154,161,168に記載されている。
' これを、列 3,7,11,・・・ となるので ⇒ 3+(J-1)*4 に転記する。
    For j = 1 To 5
      Cells(1, 3 + (j - 1) * 4) = Cells(102 + (j - 1) * 7, "BA")
    Next j
    
    For j = 6 To 10
      Cells(1, 3 + (j - 1) * 4) = Cells(102 + 3 + (j - 1) * 7, "BA")
    Next j

'次に時間枠(3:00,9:00,15:00,21:00)を転記する。
    For j = 1 To 5
        For k = 1 To 4
          Cells(2, 3 + (k - 1) + (j - 1) * 4) = Cells(105 + (k - 1) + (j - 1) * 7, "BA")
        Next k
    Next j
    For j = 6 To 10
        For k = 1 To 4
          Cells(2, 3 + (k - 1) + (j - 1) * 4) = Cells(105 + 3 + (k - 1) + (j - 1) * 7, "BA")
        Next k
    Next j
  
'日付と時刻を見やすくするため、セルの書式、セルの結合をしておく。
    For j = 1 To 10
      Cells(1, 3 + 4 * (j - 1)).NumberFormatLocal = "G/標準"
      Range(Cells(1, 3 + 4 * (j - 1)), Cells(1, 6 + 4 * (j - 1))).Merge
      Range(Cells(1, 3 + 4 * (j - 1)), Cells(1, 6 + 4 * (j - 1))).HorizontalAlignment = xlCenter
        For k = 1 To 4
          Cells(2, 3 + (k - 1) + 4 * (j - 1)).NumberFormatLocal = "hh:mm"
        Next k
    Next j
End If

'天気に対するコメント、最初のデータはBB列(54列)より(晴れ、曇りなど)を転記する。
'ここからは、URLを読んだ数毎に、読込み列は+7する必要がある。
'Webから写し取ったセル内の天気コメントは、全て二重表現になるので、文字数を1/2にする。
     For j = 1 To 5
         For k = 1 To 4
           charsell = Range(Cells(105 + (k - 1) + (j - 1) * 7, 54 + (i - 1) * 7).Address)
'セル内の文字数を数える。
           nsell = Len(charsell)
'二重に書いているので数値を半分にする。
           hnsel = nsell / 2
'セル枠に書かれている文字の前半分
           sadd = Mid(charsell, 1, hnsel)

           If InStr(sadd, "晴れ") > 0 Then
           rain = 0
           Else
           End If
           If InStr(sadd, "曇り") > 0 Then
           rain = 15
           Else
           End If

           If InStr(sadd, "雨") > 0 Then
           rain = 20
'降水量が書き込まれたセル[qrainstr]には、文字形式で「2㎜」などと書かれている。
'全角1文字[㎜]の左側の文字を数値[qrain]にして、rainhard 以上なら青い色を濃い青 33 にする。
           qrainstr = Range(Cells(105 + (k - 1) + (j - 1) * 7, 57 + (i - 1) * 7).Address)
           qrainnbr = Left(qrainstr, InStr(qrainstr, "㎜") - 1)
           qrain = Val(qrainnbr)
             If qrain > 0 Then
'「小雨」で、雨量が 0以上なら色は薄い水色(28)に設定する。
             rain = 28
             Else
             End If
             
             If qrain >= rainhard Then
'「小雨」で、雨量がここで設定した2mm以上なら色は濃い水色(33)に設定する。
             rain = 33
             Else
             End If
         Else
         End If
         
'セルに天気コメントを書き入れ、そのセルの色を付ける。
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 4) = sadd
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 4).Interior.ColorIndex = rain
         Next k
     Next j

'基本的に1~5日目までの処理と同じだが、記載されている場所が違うので別処理とした
     For j = 6 To 10
         For k = 1 To 4
           charsell = Range(Cells(105 + 3 + (k - 1) + (j - 1) * 7, 54 + (i - 1) * 7).Address)
           nsell = Len(charsell)
           hnsel = nsell / 2
           sadd = Mid(charsell, 1, hnsel)
        
           If InStr(sadd, "晴れ") > 0 Then
           rain = 0
           Else
           End If
           If InStr(sadd, "曇り") > 0 Then
           rain = 15
           Else
           End If
         
           If InStr(sadd, "雨") > 0 Then
           rain = 20
           qrainstr = Range(Cells(105 + 3 + (k - 1) + (j - 1) * 7, 57 + (i - 1) * 7).Address)
           qrainnbr = Left(qrainstr, InStr(qrainstr, "㎜") - 1)
           qrain = Val(qrainnbr)
             If qrain > 0 Then

             rain = 28
             Else
             End If
             
             If qrain >= rainhard Then
             rain = 33
             Else
             End If
         Else
         End If
        
'セルに天気コメントを書き入れ、そのセルの色を付ける。
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 4) = sadd
         Cells(3 + (i - 1), 3 + (k - 1) + (j - 1) * 4).Interior.ColorIndex = rain
         Next k
     Next j

'B列のデータが有る限り処理する為カウンターを1つ進めて、最初の処理点に戻す。
 i = i + 1
Loop

imax = i - 1

'直ぐに必要としないデータ領域を非表示にし、Webから写し取ったセル部分を削除する。
 Columns("B").Hidden = True
 Range(Columns(53), Columns(53 + imax * 7)).Delete

End Sub

《注記》 ここで、もしWebから転記した生データを確認したいのなら、このマクロの「Range(Columns(53), Columns(53 + imax * 7)).Delete」部分をコメント行にすればよい。そうすれば、第53列目から後半の列に、転記されたデータを見る事が出来る。

《Excelシートの書き方》

ExceldataExcelシートの書き方の事例を記載する。

①先ず、Google検索で
日本気象協会 10日間天気予報 青森県」をキーワードにして、該当するURLを検索する。
②検索された一覧より、
『青森市の10日間天気(6時間ごと) - 日本気象協会 tenki.jp』 を選ぶ。ここでのポイントは、(6時間ごと)というキーワードが入っているものを選ぶこと。
③②で選んだ画面を開き、URLをコピーする。
 この例では、『https://tenki.jp/forecast/2/5/3110/2201/10days.html
』となっている。
 10日間天気予報のデータが含まれているという事を htmlの直前に書かれている 
10days で確認しておく。
④これを、ExcelシートのB列に貼り付ける。
 貼り付ける順番は、自分が訪問したい場所順に、第1番目の訪問場所のURLは3行目に、第2番目の訪問場所は4行目に記載、・・・。必要な訪問場所を順番に貼り付ける。
⑤天気予報を確認したい場所のURL貼り付けが終われば準備完了である。
 マクロは、B列にデータが無くなれば処理を終了するようになっている。

 ・C列からAP列に処理結果が記載され、WebからこのExcelシート内に転記したデータは消去するようにしてある。
 ・
C列からAP列のセル幅は、標準値になっているので、見やすくするために列幅の自動調整をするのが良い。

⑥A列の第3行目以降は、URLの説明書きとして使用するのが良い。
 また、AQ列~AZ列もコメント書きに使用することが出来る。

⑦マクロを実行させた上記のデータでの結果(2017/10/01 23:00処理)は、下記のようになった。(ご参考)
10










《表示結果をより見易くするために》
 2017/10/04追記

①表の幅をデータの文字長さに合わせて、C列からAP列までを自動調整する。
表のC1から第42列(AP列)の第(imax+2)行まで罫線を引く。
③②の
セル中のデータは、セルの幅方向の中央に置く。
これを行うためには、上記マクロの第184行のところに、下記のマクロを挿入すればいい。

'表の幅をデータの文字長さに合わせて自動調整する。
'範囲は、C列からAP列まで
Range("C:AP").Columns.AutoFit

'表の罫線を引く。
'罫線を引く範囲は、C1から第42列(AP列)の第(imax+2)行まで
Range(Cells(1, 3), Cells(imax + 2, 42)).Borders.LineStyle = xlContinuous

'セルの中のデータは幅方向の中央に置く
Range(Cells(1, 3), Cells(imax + 2, 42)).HorizontalAlignment = xlCenter

«燧ケ岳登山と御池古道を歩く計画

February 2018
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28      

Recent Trackbacks

無料ブログはココログ