Arduinoの覚書

自分の備忘録です。Arduino以外もあります。

ATOM Lite 5.外付LEDの点滅(digitalWrite)

外付けLED 1個をデジタル出力で点滅させる。

使用する抵抗値の計算

計算回路

(ATOM LiteのG22)---(アノード [LED] カソード)---(抵抗)---(GND)

抵抗値計算

ATOM LiteのG22がH時、G22のpin電圧は3.3V(実測3.286V デジタルマルチメータM-6000Mにて)でした。下記LEDのVF = 2.1Vtypより、抵抗の両端の電圧はVr = 3.3 - 2.1 = 1.2V。室内で実験するので、明るくせずに流す電流は定格20mAの1/4ぐらいとしてIF = 5mA。この時、入れる抵抗値はR = 1.2V / 5mA = 240Ω。手元にあった330Ωを使うとIF = 1.2V / 330Ω = 3.6mA流れる。今回は1回路だが、6回路ではIF6 = 3.6mA x 6回路 = 21.8mAになる。esp32-pico-d4のデータシートでは1pinあたりのHレベル掃き出し電流IOH = 20mAmaxとなっている。

必要なもの

  • ATOM Lite (スイッチサイエンス)
  • ブレッドボードx1 (秋月電子)
    (2+5+5+2)x25=350穴以上 200円程度

f:id:Arduino:20201202175602j:plain

  • ブレッドボード用ジャンパー線 オス-オス (秋月電子)
    10cm程度数本 長さいろいろ60本で220円

f:id:Arduino:20201202180246j:plain

  • ピンヘッダ 2.54mmビッチx1列 5pinx1, 4pinx1 (秋月電子)
    長pinをハサミで切る。1円/pin程度

f:id:Arduino:20201202180300j:plain

  • LEDx1 (秋月電子) 120円
    OSX10201-GYR1 (OptoSupply) 10個のLEDが一体化
    2.54mmビッチ 20pin
    角の切欠側が1番pinでLED-Aのアノード、20番pinがそのカソード
    LED-A~LED-Eの5個は黄緑色
    LED-F~LED-Hの3個は黄色
    LED-I~LED-Jの2個は赤色
    VF = 2.1Vtyp, 2.5Vmax (IF = 20mA時)
    IF = 25mAmax
    Iv = 35mcd (IF = 20mA時)
    写真は次の記事参照
  • 抵抗 330Ωx1 (Amazon)
    橙-橙-茶-金は、3-3-1-5 → 33x10^1±5% = 330Ω±5%

f:id:Arduino:20201202180320j:plain

動作

外付けのLED 1個が1秒点灯、1秒消灯を繰り返す。

スケッチ


// ATOM Lite LED点滅
// 外部LED1個
#include "M5Atom.h"
const int led1 = 21;  // G21をLED1端子とする
const int waitTime = 1000;  // 1秒

void setup() {
  pinMode(led1, OUTPUT);  // LED1をデジタル出力とする
}

void loop() {
  digitalWrite(led1, HIGH); // LED1端子をHにする
  delay(waitTime);          // 待つ
  digitalWrite(led1, LOW);  // LED1端子をLにする
  delay(waitTime);          // 待つ
}

<― 前へ

目次へ

次へ ―>




以上

ATOM Lite 4.降水確率のLED表示

降水確率をLED表示します。Wi-Fi接続をして、気象庁の降水確率を06-12時 → 12-18時 → 18-24時で今日 → 明日 → 明後日の順にLEDで色表示します。降水確率は、40~100%→青色、30%→白色、20%→黄色、10%→赤色、0%→緑色です。

必要なもの

  • ATOM Lite
  • USB電源
  • USBケーブル

説明

Wi-Fiは、2.4GHzのb(11Mbps),g(54Mbps),n(300Mbps)のみ接続可能です。(ATOM Lite仕様より)
スケッチ内に接続Wi-FiSSIDとパスワードを記入しておきます。

降水確率は一定時間内(ここでは6H)に1mm以上の雨or雪の降る確率で、四捨五入して10%単位で表現しています。気象庁の天気予報
 https://www.jma.go.jp/jp/yoho/320.html (横浜地方気象台)
を使用します。実際は、気象庁の天気予報情報をXMLで配信とJSONP形式で配信してくれているdrk7.jp
 https://www.drk7.jp/weather/
のサービスを利用します。

XMLファイルで、ある日ある場所の1日分(実際は7日分)を抜出し、字下げをすると以下が得られます。


<weatherforecast>
  <title>weather forecast xml</title>
  <link>http://www.drk7.jp/weather/xml/14.xml</link>
  <description>気象庁の天気予報情報を XML で配信。1日1回 AM 6:00 ごろ更新。</description>
  <pubDate>Thu, 26 Nov 2020 06:00:03 +0900</pubDate>
  <author>気象庁</author>
  <managingEditor>drk7.jp</managingEditor>
  <pref id="神奈川県">
    <area id="東部">
      <geo>
        <long>139.5479</long>
        <lat>35.5142</lat>
      </geo>
      <info date="2020/11/26">
        <weather>くもり時々晴れ</weather>
        <img>http://www.drk7.jp/MT/images/MTWeather/201.gif</img>
        <weather_detail>北の風 日中 東の風 くもり 朝 から 昼過ぎ 晴れ 所により 夜遅く 雨</weather_detail>
        <wave>波 1メートル</wave>
        <temperature unit="摂氏">
          <range centigrade="max">17</range>
          <range centigrade="min">10</range>
        </temperature>
        <rainfallchance unit="%">
          <period hour="00-06">0</period>
          <period hour="06-12">10</period>
          <period hour="12-18">10</period>
          <period hour="18-24">30</period>
        </rainfallchance>
      </info>
    </area>
  </pref>
</weatherforecast>

 * 1時間に1mm以上の雨が降ると、普通に傘が必要です。降水確率30%以上は外出時傘を持った方が良いらしい。

ライブラリのインストール

Arduino IDE > スケッチ > ライブラリをインクルード > ライブラリを管理にて
ArduinoJson by Benoit Blanchon 6.17.0を検索してインストール > 閉じる
(Arduino_JSON by Arduino 0.1.0ではない)

動作

検証と書込みに1分半程度かかります。 書き込み終了後にUSBケーブルをPCからUSB電池に切り替えても同じ動作をします。表示は、今日の06-12時の降水確率、12-18時、18-24時、明日の06-12時、12-18時、18-24時、明後日の06-12時、12-18時、18-24時の順です。40%以上が青色、10%ずつ下がって白黄赤、0%が緑です。シリアルモニタにはそれ以外に詳しいデータも表示されます。

注意 朝6時頃にデータを更新しているので、深夜1時に今日のLED表示を見ると、実際は昨日の降水確率です。

スケッチ


// ATOM Liteで降水確率色表示
// 接続できるWi-Fiは2.4GHzのb(11Mbps),g(54Mbps),n(300Mbps)のみ
// 気象庁の天気予報をJson型式に変換してくれるdrk7.jpを利用
// drk7.jpの更新は毎朝6時頃
// 今日と明日と明後日の06-12,12-18,18-24時の降水確率9件を色表示
// LEDの色は、緑(0%), 赤(10%), 黄(20%), 白(30%), 青(40~100%)とする
// 起動時に1回点灯
// 気象庁の天気予報 https://www.jma.go.jp/jp/yoho/320.html
// 変換サイト https://www.drk7.jp/weather/
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "M5Atom.h"
const char* ssid     = "xxxxxxxxxxxxxxx";  // SSID 文字列ポインタ
const char* password = "xxxxxxxx";         // PW
const char* endpoint = "https://www.drk7.jp/weather/json/14.js";//神奈川県
const char* region   = "東部";                  // 横浜地方気象台
// 関東1都6県は
// 東京都→"・・・/13.js", 東京→"東京地方","伊豆諸島北部","伊豆諸島南部","小笠原諸島"
//神奈川県→"・・・/14.js", 横浜→"東部", 小田原→"西部"
// 埼玉県→"・・・/11.js", さいたま→"南部", 熊谷→"北部", 秩父→"秩父地方"
// 千葉県→"・・・/12.js", 千葉→"北西部", 銚子→"北東部", 館山→"南部"
// 茨城県→"・・・/08.js", 水戸→"北部", 土浦→"南部"
// 栃木県→"・・・/09.js", 宇都宮→"南部", 大田原→"北部"
// 群馬県→"・・・/10.js", 前橋→"南部", みなかみ→"北部"
DynamicJsonDocument weatherInfo(20000);       //


String createJson(String jsonString){             // JSONPをJSONにする関数
  jsonString.replace("drk7jpweather.callback(","");      // 
  return jsonString.substring(0,jsonString.length()-2);  // 
}


DynamicJsonDocument getJson() {           // 
  DynamicJsonDocument doc(20000);         // 
  if ((WiFi.status() == WL_CONNECTED)) {  // 
    HTTPClient http;                      // 
    http.begin(endpoint);                 // 
    int httpCode = http.GET();            // 
    if (httpCode > 0) {                   // 
      String jsonString = createJson(http.getString());//jsonオブジェクト作成関数
      deserializeJson(doc, jsonString); //JSON文字列をCFML(構造体や配列など)に変換
      } else {
      Serial.println("HTTP要求エラー");   // シリアルモニタに表示
    }
    http.end();                     // リソースを解放
  }
  return doc;                       // 
}


void lighting(String rain) {        // LED1回点灯関数
    int intrain = rain.toInt();     // 文字を数値に変換
    Serial.println(intrain);        // シリアルモニタに表示
    if (intrain >= 40){             // 降水確率40~100%時
      M5.dis.drawpix(0, 0x0000ff);  // 青点灯
    } else if (intrain >= 30) {     // 30%時
      M5.dis.drawpix(0, 0xffffff);  // 白点灯
    } else if (intrain >= 20) {     // 20%時
      M5.dis.drawpix(0, 0xffff00);  // 黄点灯
    } else if (intrain >= 10) {     // 10%時
      M5.dis.drawpix(0, 0x00ff00);  // 赤点灯
    }else {                         // 0%時
      M5.dis.drawpix(0, 0x800000);  // 緑点灯
    }
  delay(1000);                      // 1秒点灯
  M5.dis.drawpix(0, 0x000000);      // 区切用に黒点灯
  delay(200);                       // 0.2秒消灯
}

void drawWeather(String infoWeather) {  // 1日分のデータ表示関数
  DynamicJsonDocument doc(20000);    // 
  deserializeJson(doc, infoWeather); // 
  String docdate = doc["date"];      // 予報年月日
  Serial.print("(");  Serial.print(docdate); //シリアルモニタに表示
  Serial.print("):");                // シリアルモニタに表示
  String weather = doc["weather"];   // 天気予報 
  Serial.println(weather);           // シリアルモニタに表示
  String weatherdetail = doc["weather_detail"];  // 詳しい天気予報
  Serial.println(weatherdetail);     // シリアルモニタに表示
  String docwave = doc["wave"];      // 波の高さ
  Serial.println(docwave);           // シリアルモニタに表示
  String maxTmp = doc["temperature"]["range"][0]["content"];
  //                      温度      範囲  最高    値
  String minTmp = doc["temperature"]["range"][1]["content"];
  //                      温度         範囲   最低    値
  String rain0006 = doc["rainfallchance"]["period"][0]["content"];
  //                         降水確率         期間  00-06   値
  String rain0612 = doc["rainfallchance"]["period"][1]["content"];  // 06-12
  String rain1218 = doc["rainfallchance"]["period"][2]["content"];  // 12-18
  String rain1824 = doc["rainfallchance"]["period"][3]["content"];  // 18-24
  Serial.print("気温(℃):"); Serial.print(maxTmp); // 最高気温を表示
  Serial.print("max,");                        // シリアルモニタに表示
  Serial.print(minTmp); Serial.println("min"); // 最低気温を表示
  Serial.printf("降水確率±3H:3時%3s,9時%3s,15時%3s,21時%3s", rain0006, rain0612, rain1218, rain1824);//降水確率
  Serial.println("%");                       // シリアルモニタに表示
  lighting(rain0612);                        // 06-12時の降水確率を色で点灯
  lighting(rain1218);                        // 12-18時の降水確率を色で点灯
  lighting(rain1824);                        // 18-24時の降水確率を色で点灯
  Serial.println("");                        // シリアルモニタに表示
}

void setup() {
  M5.begin(true, false, true);  //(LCD,PowerEnable=true,Serial)
  delay(50);                               // 50mS待つ
  Serial.begin(115200);                    // Upload Speed=15200にする
  WiFi.begin(ssid, password);              // Wi-Fi設定を初期化
  Serial.println("");                      // シリアルモニタで改行
  Serial.println("Wi-Fiに接続中です。");     // シリアルモニタに表示
  while (WiFi.status() != WL_CONNECTED) {  // 接続状態が接続完でない時
    delay(500);                            // 0.5S待つ
    Serial.print(".");                     // シリアルモニタに表示
    Serial.print(WiFi.status());           // Wi-Fiの状態数表示
    // 0:WL_IDLE_STATUS     WiFi.begin()が呼び出され
    //                      下記3か4になるまでの一時的状態
    // 1:WL_NO_SSID_AVAIL   使用可能なSSIDがない
    // 2:WL_SCAN_COMPLETED  スキャンネットワークが完了
    // 3:WL_CONNECTED       WiFiに接続が確立
    // 4:WL_CONNECT_FAILED  すべての試行で接続失敗
    // 5:WL_CONNECTION_LOST 接続が失われた
    // 6:WL_DISCONNECTED    ネットワークから切断
    // 255:WL_NO_SHIELD     WiFiシールドが存在しない
  }                                        // 接続完の時
  Serial.println("");                      // シリアルモニタで改行
  Serial.println("Wi-Fiに接続しました。");    // シリアルモニタに表示
  Serial.print("IPアドレス:");              // シリアルモニタに表示
  Serial.println(WiFi.localIP());          // WiFiのIPアドレスを表示
  weatherInfo = getJson();                 // 関数実行
  WiFi.disconnect(true);                   // Wi-Fi機能のみがoff
  String day0 = weatherInfo["pref"]["area"][region]["info"][0];
  //                          県     東部    領域     情報   今日
  String day1 = weatherInfo["pref"]["area"][region]["info"][1];  // 明日
  String day2 = weatherInfo["pref"]["area"][region]["info"][2];  // 明後日
  Serial.print("今日");   drawWeather(day0); // 今日のデータ表示関数
  delay(500);  // 0.5秒待つ
  Serial.print("明日");   drawWeather(day1); // 明日のデータ表示関数
  delay(500);  // 0.5秒待つ
  Serial.print("明後日"); drawWeather(day2); // 明後日のデータ表示関数
}

void loop() {
}




以上

目次

ATOM Lite

  1. 仕様
  2. 動作確認
  3. 温湿度&気圧測定
  4. 降水確率のLED表示
  5. 外付LEDの点滅(digitalWrite)

M5CAMERA

 

M5Stack

 

Minecraft Earth

  1. シーズン12~14
  2. Tips

Arduino Uno

修正予定

  1. Arduino 参考書
  2. Arduino ピン内容
  3. Arduino 1.内蔵LEDの点滅
  4. Arduino 2.外付LEDの点滅
  5. Arduino 3.外付SWのカウント
  6. Arduino 4.Cdsによる明るさ表示
  7. Arduino 5.温湿度&気圧測定(I2C通信)
  8. Arduino 6.PWM調光によるLED点滅
  9. Arduino 7.PCからLED点灯
  10. Arduino 8.PCからLED調光

Raspberry Pi

修正予定

  1. 参考書
  2. ピン内容
  3. 使用環境 まだ

資料

  1. Hatena Blogについて
  2. Hatena 見たままモードでのHTML編集
  3. 暑さ指数など
  4. Go To Eat

以上