macsbug

Just another WordPress.com site

Archive for 10月 2016

ESP32 Beginning

leave a comment »

Nano32 を試してみました。                   2016.11.03

OLEDのVCCは Nano32のV3(3.3v) から配線しGND,SCL,SDAは直挿ししました。
ピン数は40ピン。ピンの縦幅は ブレッドボード上下に1ピン空くサイズです。
スケッチで WiFi を停止し without TELEC にします。
2016.11現在の Arduino IDE ESP32 は BLE, Analog入出力, RTC 等は未実装です。
基板中央下に NANO32 と書かれた左に LED があり IO16 と書かれています。
この LEDは GPIO 16 で pinMode(16, OUTPUT); で「Lチカ」ができます。

Nano32 Front

Nano32 Rear

Nano32 (40pin)

NodeMCU-32S Front (38pin)

NodeMCU-32S Rear (38pin)


 

準備その1:ハード編
1. Nano32(ESP32) ボードの入手:
Cytron:NANO32 IoT Development Board:今回の注文先です。
_ FedExを使用し $39.55($24.75+14.80(送料):4237円 と高い商品です。
_ マレーシアのCytronに10月20日に注文し25日に到着。書類は丁寧。
_ ピン数は40。基板裏には作られた GRAVITECHとmakerasia の文字。
GRAVITECH:NANO32 IoT Development Board – 4MB
ESPert:Get your Nano32
Aliexpres:NodeMCU-32S  が一斉に発売しました。最安は$23.20です。
_ ピン縦幅は ブレッドボード上下に1ピン空くサイズです。
_ ピン番号は ボードの裏に印刷 されています。これは非常に見づらい。
_ ピン数は 38。FTDIはCP2102。LDOはAMS1117-33(ノイズ大)。
ebay:NodeMCU-32S が一斉に登場してきました。
_ NodeMCU-32S:2718円($25.99)。Aliexpressより少し高い。


 

準備その2:ソフト編。 条件は マック( macOS )です。
ESP32用フォルダーを用意しArduino IDE へインストールする。
1. espressif から「arduino-esp32」をダウンロードする:
_  「arduino-esp32-master 」フォルダーが出来る。
_  「arduino-esp32-master 」フォルダーの名前を「esp32」に変更。
_  「esperssif」という名前の新規フォルダーを作る:
_  「esperssif」フォルダーの中に「esp32」フォルダーを入れる。

2. macOS用の 「xtensa-esp32-elf」をダウンロードする:
_   詳細:espressif / esp-idf:Set up of Toolchain for Mac OS
_  「xtensa-esp32-elf」ファイルが入手できました。
_  「xtensa-esp32-elf」フォルダーを「esperssif」フォルダーの中
_   esperssif / esp32 / Contents / hardware / tools に入れます。
_  これで ESP32用フォルダーの準備ができました。
_  

3. Arduino IDE 本体に 「esperssif」フォルダーをインストールする:
_  Arduino IDE アプリへ マウスを当てて右クリックします。
_ 「パッケージの内容を表示」され 選択すると中が開きます。
_ 
_ 「Contents」フォルダーの中の「Java」を開きます。
_ 「hardware」フォルダーの中に「esperssif」フォルダーを入れる。
_  Arduino IDE を閉じて終了です。

_  他の方法としてターミナル操作でインストールする方法もあります。

2016.12.25 追記:ターミナルで arduino-esp32 の Installation ができました。
これまでエラーで出来ませんでしたが git や他の物がインストールされて
いない為にエラーが起きました。
手順は省きますが 幾つかの入っていない物をインストールしました。
結果 arduino-esp32 の Installation の指示通りにインストールできました。

4. Arduino IDE を起動。ボードマネージャ…に ESP32 が3つ表示される。

_ Flash Frequency は 80MHz と 40MHz。CPU Frequency の表示は無し。


 

ESP32 ( Nano32 ) 初めのメモ:
1. スケッチの起動:スケッチを書込みした後は そのままでは動きません。
_  書込み後に 基板の EN ( Reset ) スイッチを押します
_  注:ESP8266 とは異なり書込み後に自動的に起動しない為 慌てない事。

2. 命令の違い:ESP8266 での エラー や GPIOを高速操作時の不具合である
_   Wdt Error は発生しない為 以下の3つの命令は不要です。
_   ESP32 では以下の命令はエラーが出ます。
_   -1:extern “C” { #include “user_interface.h” }
_   -2:ESP.wdtDisable();
_   -3:yield()
_  これはどういう事を示すか。つまり ESP8266 はハードに問題があった
_   のではないか?と想像してしまいます。
_  ESP8266 は Wdtエラーの為にスケッチやライブラリーに yield() を入れ
_   て解決していますが ESP32 では エラーが出る為に 削除が必要です。
_  これまでの スケッチは おおよそ直ぐは動きません。

3. LED:LED は GPIO 16 に接続されており 16 でLチカができます。
_     NodeMCU-32S は GPIO 2 , Sparkfun ESP32 は GPIO 5 です。

4. ピン配置:Nano32のピン配置は都合良く 左上は I2Cの GND,SCL,SDA
_  と並び I2C OLED を直付可能。ただし VCC 3V は線を引く必要がある
_  のでもう一工夫欲しかったと思う。配線が少ない事は楽になります。
_  NodeMCU-32S, Sparkfun ESP32 のそれぞれのピン配置は異なります。

5.  速度:3D Cube の回転速度は ESP8266 とほぼ同じでした。
6.  I/Oの数:ピン数が多いので気が楽になります。
7.  Arduino IDE での書込み速度:速いです。
8.  消費電流:この回路のUSB 5V の消費電流は 61mAでした。
9.  書込み後に ENスイッチを押す件は 別な方法がある事を期待します。

10. ESP32の現状:
_  sparkfun esp32-thing-hockup-guide の説明によると 未実装が有ると
_  の事。Bluetooth, Analog Input (analogRead([pin])),Analog Ouptut
_  (analogWrite([pin], [value])), WiFi Server and WiFI UDP,Real-Time
_  Clock, Touch-controller interface で 確かにエラーがでます。

11. Nano32のCPU Crystal Frequency:40MHzです。(Nano32の説明書)。
_  
_  Sparkfun の CPU Crystal Frequency は 26MHzです。
_  CNXSoft – EMBEDDED SYSTEMS NEWS には 160MHz と記載あり。
_  Nano32 の board.txt は「nano32.build.f_cpu=160000000L」と書かれている。
_     ESP32 Technical Reference Manual の 3.2.3 CPU Clock に最高160MHz とある。
_  Espressif :ESP32 hardware Design Guideline に 40MHz+-10ppm とある。
_  page 3:40MHz, 26MHz, 24MHz サポートと書かれています。
_  Crystal は 40MHz で 内部はPLL回路で 160MHz動作していると判断します。
_  Espressif ESP32 Core Board:40MHz です。
_  

12. AUTO PROGRAM CIRCUIT (書込み自動化) が組み込まれています。

13. ESP32の資料Espressif Systems:ESP32 Documentation
_  ESP-WROOM-S2 DatasheetESP32 Technical Reference Manual がある。

14. HACKADY:HOW TO GET STARTED WITH THE ESP32:開始の手順。


 

ESP8266とNano32の I2C OLED表示速度比較:
_ 結論:たいして速度は変わりませんでした。
_ 条件:LibraryはAdafruitのESP Adafruit SSD1306とAdafruit GFX。
_  ESP8266のCPU Frequency選択は 160MHz。ESP32(nano32)は
_  表示が無く Flash Frequency 80MHz を選択。
_  ESP8266(160MHz)(左) と Nano32(Flash 80MHz)(右)


ピンアサイン:nano32


 

感想:
1. Nano32 は価格が高いですが調査の為に購入しました。NodeMCU-32S も高い
_  ですが調査の為に注文しておきました。
2. Lチカは 基板にある LED が GPIO 16 ですので 16 を指定し動きました。
_  ESP8266 で動いていたスケッチは おおよそエラーがでて動きません。
_  OLED の 3D Cube は 動きました。理由は Adafurit の Library の為で ESP8266
_  への対応が低い為と思われます。
3. ESP32 は開発中ですので espressif の「arduino-esp32」は変わります。
_  初期のボードは「ESP Dev Module」しかありませんでした。
_  そして 各PC用の 「xtensa-esp32-elf」が必要です。
4. 疑問点:
_  速度は現Arduino IDE ESP32環境での結果ですので疑問を持っています。
_  1. Nano32 や NodeMCU-32S のCPUクロック周波数は幾つなのか?
_    EspressifSystem の John Lee氏が 160MHz と述べている。2016.11.11 追記
_   ともの技術メモ:ESP32のβ版がもうすぐリリース!?
_  2. Arduino IDE ESP32 のボードに CPU Frequency の表示が無いのは何故か?

5. 解らない事や不明な点 記載ミスもあるかと思いますがご了承ください。


広告

Written by macsbug

10月 31, 2016 at 5:47 am

カテゴリー: ESP32, ESP8266

0.95″ 96×64 Color OLED in ESP8266

leave a comment »

9.5″ 96×64 Color OLEDを ESP8266 で使用しました。        2016.10.30


65K Color OLED Display 3.3v 5v Serial SPI Small LCM Module:928円。
Resolution:96×64、Color:65K、Drive:SSD1331、外形:27.3 x 30.7 mm

端子:
GND:GND、VCC:2.8 – 5.6V ( U2 LDO 662K 3.3V)
SCL : Clock、SDA:MOSI、RES:Reset、DC:data/command、CS:chip-select signal


max mc costa の sumotoy氏による SSD_13XX のサンプルです。


s21olid3d SSD_13XX の
examples順に
並べてあります

 

準備:費用総計:1255円。 価格は 円レート等で変わります。

No Nomen Link Price(円)  memo
1 D1 mini or D1 mini Pro *  ebay  327
2 9.5″ 96×64 Color OLED Module  ebay  928
3 Library:sumotoy / SSD_13XX  SSD_13XX  –
4  Resistor 10KΩ  –  –

* WiFi.mode(WIFI_OFF);:この命令で送信電波を停止し without TELEC にします。


 

配線:基本は sumotoy / SSD_13XX に書かれています。
_  OLED と ESP8266 に7本配線します。
_ OLED:ESP8266
1. GND : GND
2. VCC : 3.3V
3. SCL:GPIO=14 ( D5 ):10KΩ Pull-uP:14は固定。
4. SDA : GPIO=13 ( D7 ):10KΩ Pull-uP:13は固定。
5. RES : 3.3V:できれば 10KΩ Pull Up にする。
6. DC  : GPIO= 2 ( D4 ):空いているポートでスケッチで指定する。
7. CS   : GPIO= 0 ( D3 ):空いているポートでスケッチで指定する。



 

スケッチ:GPIO端子の基本的な記述。
_ CS は GPIO=0、DCは GPIO=2、SSD1331 OLED の名前は tft とする。

#include <SSD_13XX.h>
#define CS  0  // D3
#define DC  2  // D4
SSD_13XX tft = SSD_13XX(CS, DC);


 

感想:
1. 価格:96×64 と小さく 安い所でもTFTの3倍で 930円程 になり高いです。
_  他のColor OLED:SSの1.5インチ 16ビット色のOLEDディスプレイは 5756円
_  で論外の買う値段ではない。
_  Aliexpress や ebay では 128×128 Color OLED Mudule は 300円台の低価格の
_  128×128 TFT に変わっている。
_  ebayに 1.8″ Serial:UART/I2C/SPI True Color OLED 160×128 Display Module
_  があるが価格が 2850円($27.2) と高いので論外。
2. 表示速度:画面の小ささもありますが SPI は速いです。
3. SDA と SCL の端子:ライブラリー内で固定(13,14)で この番号で動作します。
_  SSD_13XXの説明とライブラリー内の記述を調べると 私の理解不足なのか
_  何故この番号なのかよくわかりません。
4. 画像データー:ファイルや SD から読み込む方法がありライブラリーの中に
_   構成されていますので読むと参考になるかと思います。画像データの作り
_   方は CD-Image-Converter で作る様ですが詳細は調べていません。
_   フォントも LCD_Font_Converter があるようです。
5. 他の SSD1331 のライブラリー:幾つか試しましが動きませんでした。
6. ピクセル:SSD1331 は 96×64、SSD1351 は 128×128の様です。
7. ライブラリー;max mc costa の sumotoy氏に感謝致します。TFTにも感謝。
_  ESP8266のフォルダーだけでなく他のスケッチも動きました。
_  1つだけ「image_eyeAnimation」はエラーで動きませんでした。
8. 課題:電源投入時に画面が乱れたり動かなくなる事があります。USBケーブル
_   や電源を変えると正常に起動する事もあり 電源起動時のリセット
_     シーケンスではないかと予想していますが 課題です。
9. 注意:電源を入れたまま OLED を抜き差ししない事。動かなくなります。
_     ただし、何度か電源を入れ直すとなんとか戻ります。


 

OLEDについて:
_ OLED(有機発光ダイオード)は、バックライトを必要としません。
_ 高輝度で軽量で薄く、広視野角、低動作電圧と低消費電力です。
_ 図の破線部は TFT の場合に必要な構成で OLED では不要になりました。


Written by macsbug

10月 30, 2016 at 5:29 am

カテゴリー: ESP8266

1.8″ 128×160 Color TFT in ESP8266

leave a comment »

1.8″ 128×160 Color TFT ST7735B と ESP8266 でアナログ時計を作る。     2016.10.23

ケースのサイズは 60 x 51 x 17mm。費用は 総計859円です。


1.8″ 128×160 Color TFT

1.44″ 128×128 Color TFT

1.44″ 128×128 Color TFT in ESP8266 :2016.10.07 から 今回は
1.8″ 128×160 TFT + SD Slot を使用。価格は 317円 と低価格です。
詳細は上記の記事を参照願います。
1.44″ より少し大きくなりますが SD SLOT があり用途が広がります。


 

準備:費用総計:859円。 :基板とピンを使用しなければ(直付け) 719円で出来ます。

No. Nomen Link Price(円) Memo
01 1.8″ 128X160 SPI Color TFT  1.8″ Color TFT 317  1個 GBP 2.50
02 I2C DS3231 RTC Module  DS3231 RTC    89  1個 USD 0.91
03 WeMos D1 mini 又は Pro *  D1 Mini 313  1個 USD 2.47
04 0.3mm厚基板  秋月    60  1個
05 シングルピンソケット(低メス)  秋月    60  1個
06 ロー ピンヘッダ(低オス)  秋月    40  1個
07 Resistor 10KΩ  –  –  5個
08 ケース(3Dプリンターで製作)  –  –  1個
09 RTClib Library  RTClib  –  RTC
10 Adafrui-GFX Library  Adafruit-GFX Library  –  TFT
11 Adafruit-ST7735-Library  Adafruit-ST7735-Library  –  TFT

 
* WiFi.mode(WIFI_OFF);:この命令で送信電波を停止し without TELEC にします。


 

配線:
1 :TFT MODULE:
_  裏にロー ピンヘッダ(低オス:黒)を取り付けます。(左)
_  黄色のピンは D1 mini が接触しない様に幾つかのピンを外す。(理由:USB端子側)
_  J1 端子(U1 LDOの左)はハンダ・ジャンパーをします。(理由:電源は3Vで使用)
_   基板の裏に「 Vin : VCC = 3V:J1 SHORT 」と書かれている。
_   (詳細:電源を3.3Vで使用する場合は U1 LDO(AMS1117-33)をパスします。

 

2 :基板表: 0.3mm基板 + WeMos D1 mini 又は D1 mini Pro + RTC を取り付ける。
_  低メスコネクターピンを使用する。(理由:厚さを薄くする為)
_  部品の位置は厚さが薄くなる様に配置します。
_  接触しやすい部分はカプトンテープ等で絶縁します。

 

3 :基板裏:
_  10KΩチップ抵抗 5個を基板に取り付けます。
_  電源+TFT SPI+SD+RTC 16本の配線をします。
_  SD Slot は 動作確認をしていませんので使用しない場合は配線不要です。

_   

_ 配線は極力平行になるようにしました。これにより2回目以降も楽に配線できます。

 

_ 直付け方式:基板とコネクターを使用しない為 製作の簡略化と費用削減ができます。
_  RTC と D1 mini Pro は両面テープで固定。
_  チップパーツは耐熱(カプトン)テープの上でハンダ付けする。
_  厚さは 9.6mm 。費用は 合計 984円 ( D1 mini Pro=582円 )。製作時間は 2時間20分。

 

4 :TFT + 基板 を ケースに入れる。(裏側)


 

TFT 2.4インチ タイプの改修:過去に製作した 2.4″ TFT LCD も同様に行いました。
_ 2.4″ 320×240 TFT ILI9341 Display に RTC(中央) を取り付け4本配線します。
_ スケッチは 記載しませんが ほぼ同じで位置やサイズを変えます。
_ この 2.4″ は ESP8266をTFT基板に両面テープで直づけし配線しています。
_ 直付けは手間と費用が省け(基板とコネクターが不要)ます。


 

TFT  ディスプレーを並べてみました。
_ 1.44″ 128×128、1.44″ 128×128。(上)。同じ物です。
_ 2.4″ 320×240、1.8″ 128×160。(下)


 

他の 1.8″ 128×160 SPI TFT ST7735 Color Display
1.8″ TFT LCD Display module ST7735S 128×160:449円

1.8″ SPI TFT Color LCD Module Display Screen128 x 160:419円

1.8″ 128×160 TFT LCD Shield Module SPI serial interface:622円


 

感想:
サイズ:1.44″ は手の平に入る「可愛い」大きさです。
_   1.8″ も手の平に入る「ピッタリ」の大きさです。この感触はかなり良いです。
厚さ:ケースの厚さを薄くするトライをしていますが今の所 最薄は 17mmです。
LEDの輝度:基板にある抵抗(30Ωや100Ω)を変更無く使用しています。
_   比較すると 1.44″ は 1.8″ より少し暗めです。
_   電流を流し過ぎたり 5V を加えるとLEDが破損しますので注意してください。
価格と容易さ:「千円以内」で「簡単に出来る」事で この物を沢山用意できます。
_   思いついた時や プログラムに集中して 直ぐ完成品が出来る様になります。
_   さらに費用を減らすには TFT基板に部品を直接接着すれば 719円で出来ます。
基板が欲しい:パターンは簡単です。どなたか基板を作って頂けると良いかも知れません。
_      条件は基板が薄くできる事と低価格、そしてもう一捻りの案です。
GPIO端子:ESP8266はGPIO端子が少ない為に端子の割り振りはパズルの様になります。
_     TFTのCSはLowにしておけば正常に動きます。つまりGPIOに接続しなく
_     とも動作します。これは少ないGPIO端子を有効に使用できます。
_     RSTもそのはずで端子の使用方法として検討課題です。


 
スケッチ:アナログ時計。

// D1 mini + 1.8" 128x160 SPI TFT + DS3231 RTC  // 2016.10.19 macsbug
// https://github.com/adafruit/RTClib           // RTClib
// https://github.com/adafruit/Adafruit-ST7735-Library
// https://github.com/pkourany/Adafruit_ST7735_mfGFX
// https://cdn-learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf
// https://github.com/sumotoy/TFT_ILI9163C/tree/Pre-Release-1.0p7/examples
// http://www.barth-dev.de/online/rgb565-color-picker/
#include <ESP8266WiFi.h>                        // WIFI
#include <Wire.h>                               //
#include <RTClib.h>                             // RTC
RTC_DS3231 rtc;                                 // RTC DS3231
#include <Adafruit_GFX.h>                       //
#include <Adafruit_ST7735.h>                    // TFT 128x128 ST7735
#define TFT_CS    15                            // TFT CS  : D8 = 15
#define TFT_RST   16                            // TFT RST : D0 = 16
#define TFT_DC    14                            // TFT DC  : D5 = 14 
#define TFT_SCLK  13                            // TFT SCK : D7 = 13 * 
#define TFT_MOSI  12                            // TFT SDA : D6 = 12 **
#define RTC_SDA    5                            // RTC D   : D1 =  5
#define RTC_SCL    4                            // RTC C   : D2 =  4
#define SD_CS      2                            // SD  CS  : D4 =  2
#define SD_MOSI    0                            // SD  MOSI: D3 =  0
#define SD_MISO    4                            // SD  MISO: D6 = 12 **
#define SD_CLK    13                            // SD  CLK : D7 = 13 *
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,   //
          TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); //
uint16_t ctrx, ctry;                            // center x,y of the clock
const uint16_t rad = 63;                        // radius of the clock
const float scosConst = 0.0174532925;
float sx=0, sy=1, mx=1, my=0, hx= -1, hy=0;
float sdeg = 0, mdeg = 0, hdeg = 0;
uint16_t osx, osy, omx, omy, ohx, ohy;
uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
uint16_t xd = 0, yd = 0;
uint32_t targetTime = 0;                        // for next 1 second timeout
uint8_t hh, mm, ss;                             // containers for current time
const char* wk[] = {                            // week
  "Sun","Mon","Tru","Wed","Thu","Fri","Sat"};   //
const char* tm[] = { "12","1","2","3","4","5",  // dial
  "6","7","8","9","10","11","12"};              //
  
void drawClockFace() {
  tft.fillCircle(ctrx,ctry,rad,0x3CDF);         // BLUE
  tft.fillCircle(ctrx,ctry,rad-4,0x0000);       // BLACK
  for (int i = 0; i < 360; i += 30) {           // Draw 12 lines
    sx  = cos((i - 90) * scosConst);
    sy  = sin((i - 90) * scosConst);
    x0  = sx * (rad -  4) + ctrx;
    yy0 = sy * (rad -  4) + ctry;
    x1  = sx * (rad - 11) + ctrx;
    yy1 = sy * (rad - 11) + ctry;
    xd  = sx * (rad -  8) + ctrx - 2;           // dial pos x
    yd  = sy * (rad -  9) + ctry - 3;           // dial pos y
    //tft.drawLine(x0, yy0, x1, yy1, 0x3CDF);   // scale
    tft.drawPixel(x0, yy0, 0xFFFF);             // scale
    String dial = "12";                         // dial
    if ( i > 0 ){ dial = String(i/30);}
    if ( dial == "12" ){ xd = xd - 3;}
    tft.setTextColor(0x3CDF);                   // BLUE
    tft.setCursor(xd, yd);
    tft.println(dial);                          // dial
  }
}

void setup(void) {
  //Serial.begin(115200);
  WiFi.mode(WIFI_OFF);                          // without TELEC
  Wire.begin(RTC_SDA, RTC_SCL); delay(10);      // RTC : SDA,SCL,D6,D1
  //--------------------------------------------//
  tft.initR(INITR_BLACKTAB);                    // 1.8" TFT setup
  tft.fillScreen(ST7735_BLACK);                 //
  tft.setTextColor(0x5FCC);                     // GREEN
  tft.setRotation(1);                           //
  tft.setTextSize(1);                           //
  //--------------------------------------------//
  ctrx = tft.width()/2; ctry = tft.height()/2;
  osx = ctrx; osy = ctry;
  omx = ctrx; omy = ctry;
  ohx = ctrx; ohy = ctry;
  drawClockFace();                              // Draw clock face
  //--------------------------------------------//
  int px = 0; int py = 0;                       // apple icon
  tft.drawLine(6+px, 1+py,7+px, 1+py,0x07E0);
  tft.drawLine(5+px, 2+py,6+px, 2+py,0x07E0);
  tft.drawLine(5+px, 3+py,5+px, 3+py,0x07E0);
  tft.drawLine(2+px, 4+py,8+px, 4+py,0xFFE0);
  tft.drawLine(1+px, 5+py,9+px, 5+py,0xFFE0);
  tft.drawLine(1+px, 6+py,7+px, 6+py,0xFD24);
  tft.drawLine(1+px, 7+py,7+px, 7+py,0xFD24);
  tft.drawLine(1+px, 8+py,9+px, 8+py,0xF800);
  tft.drawLine(1+px, 9+py,9+px, 9+py,0xF800);
  tft.drawLine(2+px,10+py,8+px,10+py,0x3CDF);
  tft.drawLine(3+px,11+py,4+px,11+py,0x3CDF);
  tft.drawLine(6+px,11+py,7+px,11+py,0x3CDF);
  //--------------------------------------------//
  DateTime now = rtc.now();                     // time geting from RTC
  hh = now.hour();
  mm = now.minute();
  ss = now.second();
  targetTime = millis() + 1000;
}

void drawClockHands(uint8_t h, uint8_t m, uint8_t s) {
  // Pre-compute hand degrees, x & y coords for a fast screen update
  sdeg = s * 6;                                 // 0-59->0-354
  mdeg = m * 6  + sdeg * 0.01666667;            // 0-59->0-360:inc sec 
  hdeg = h * 30 + mdeg * 0.0833333;             // 0-11->0-360:inc min & sec
  hx = cos((hdeg - 90) * scosConst);
  hy = sin((hdeg - 90) * scosConst);
  mx = cos((mdeg - 90) * scosConst);
  my = sin((mdeg - 90) * scosConst);
  sx = cos((sdeg - 90) * scosConst);
  sy = sin((sdeg - 90) * scosConst);
  //--------------------------------------------// yyyy.mm.dd
  DateTime now = rtc.now();                     // read 
  String yd = String(now.year());               // year
  String md = String(now.month());              // month
  String dd = String(now.day());                // day
  String we = String(wk[now.dayOfTheWeek()]);   // Week
  tft.setTextColor(0x5FCC);                     //
  tft.setCursor(135,   1); tft.println(yd);     // year
  if(now.month()<10){ md = "0" + md;}           // month add 0
  if(now.day()  <10){ dd = "0" + dd;}           // day   add 0
  tft.setCursor(  1, 120); tft.println(md+dd);  // month,day
  tft.setCursor(135, 120); tft.println(we);     // week
  //--------------------------------------------//
  tft.drawLine(ohx,ohy,ctrx+1,ctry+1,0x0000);   // Erase old positions
  tft.drawLine(omx,omy,ctrx+1,ctry+1,0x0000);
  tft.drawLine(osx,osy,ctrx+1,ctry+1,0x0000);
  //--------------------------------------------//
  tft.drawLine(hx*(rad-28)+ctrx+1,hy*(rad-28)   // Draw new hand positions
     +ctry+1,ctrx+1,ctry+1,0xFFFF);
  tft.drawLine(mx*(rad-17)+ctrx+1,my*(rad-17) 
     +ctry+1,ctrx+1,ctry+1,0xFFFF);
  tft.drawLine(sx*(rad-14)+ctrx+1,sy*(rad-14) 
     +ctry+1,ctrx+1,ctry+1,0xFA06);
  tft.fillCircle(ctrx+1,ctry+1,3,0xFA06);
  //--------------------------------------------
  osx = sx * (rad - 14) + ctrx + 1;             // Update x & y coords
  osy = sy * (rad - 14) + ctry + 1;
  omx = mx * (rad - 17) + ctrx + 1;
  omy = my * (rad - 17) + ctry + 1;
  ohx = hx * (rad - 28) + ctrx + 1;
  ohy = hy * (rad - 28) + ctry + 1;
}

void loop() {
  if (targetTime < millis()) {
    targetTime = millis() + 1000;
    ss++;
    if (ss == 60) { ss = 0; mm++;
      if (mm > 59) { mm = 0; hh++;
        if (hh > 23) hh = 0;
      }
    }
    drawClockHands(hh, mm, ss);
  }
}

Written by macsbug

10月 22, 2016 at 2:28 pm

カテゴリー: ESP8266

1.44″ 128×128 Color TFT in ESP8266

leave a comment »

1.44″ 128×128 SPI Color TFT LCD Display を ESP8266 で動かす。    2016.10.07

この TFT Display は ESP8266 へ接続でき 1個278円という最強の低価格品です。
サイズは 45 x 33 x 4.4 mm で WeMos D1 mini にピッタリの大きさです。

アナログ時計を表示しました。時刻情報は DS3231 RTC を使用しています。
スケッチは max mc costa : sumo toy氏の (Clock_exsample)を使用し
文字盤やデジタル表示、アイコンを追加しました。sumotoy氏 に感謝致します。


機能:
アナログ部は 時、分、秒。デジタル部は 年、月日、曜日 を表示します。
WiFi出力は送信停止 ( WiFi.mode(WIFI_OFF); ) にする事により 技適(TELEC)は非該当となります。


構成:
1. ディスプレーは 1.44″ 128×128 SPI Color TFT ST7735。 信号は3.3V動作です。
_  TFTの電源(VCC) は 3V〜5V です。LDO U1 は Marking が662Kで3.3V出力です 。
_  VCC:3.3V を接続し LDO を介しても正常に動作します。(確認済み)
_  VCC:3.3V を使用し LDO をパスする時は U1 隣の J1 をジャンパーします。(確認済み)
_  LED の電源:3.3V を接続し動作しますが 5Vを接続すると LEDが破損します。(確認済み)
_  ELECROW:1.44” 128x 128 TFT LCD with SPI Interface
_  ELECROW:TFT 1.44 SPI 配線図:このモジュールの回路図です。
2. リアルタイムクロックは I2C DS3231 RTC ( 右のIC [ DS3132 ] と 黄色の電池 )
3. 厚さ:WeMos D1 mini は 13.2mm。D1 mini pro は 11.6mm になります。
4. USB 5V の消費電流は 約130mAです。


準備:費用総計:822円。

No Nomen Link Price(円) Memo
1 1.44″ 128×128 SPI Color TFT *  1.44″ Color TFT 278  1個 $2.85
2 I2C DS3231 RTC Module  DS3231 RTC    89  1個 $0.91
3 WeMos D1 mini  D1 Mini 335  1個 $3.41
4 0.3mm厚基板  秋月    60  1個
5 シングルピンソケット(低メス)  秋月    60  1個
6 Resistor 10KΩ  –  5個
7 RTClib Library  RTClib  –  RTC
8 Adafrui-GFX Library  Adafruit-GFX Library  –  TFT
9 Adafruit-ST7735-Library  Adafruit-ST7735-Library  –  TFT

* ST7735S(V1.1),ST7735R(V1.4),ST7735(V2.1)の3つの Ver がある。
** ebay の価格は円レートで変動します。円高の時にお買い求めください。


配線:


手順:
1. 基板にコネクターと配線 ( SPI 5本、I2C 2本、電源 2本 ) を実施します。
_  プルアップ抵抗 10KΩ 5個を取り付けます。(無いと動作しません)
2. スケッチ1: RTCの初期化 は NTPを使用しない設定方法としました。
_  PC へ接続し RTC に PC の時刻を設定します。
_  PC の日付と時刻を RTC へ保存します。
_   今回 NTP (WiFi による時刻の通信)は使用しません。
_   NTP(WiFi) を使用する場合 ESP8266 は with TELEC を使用ください。
3. スケッチ2: アナログ時計。
_  アナログ時計を実行すると RTC の時刻で 時,分,秒,年,月日,曜日 を表示します。


補足: 2016.11.10 追記
1.44″ Color TFT には バージョンがあり 画像表示の違い が判明しました。
_  結果:購入に於いて選択が出来ない為に 今回の修正方法としました。
ネットで論議があり 3つのタイプが述べられています。
ライブラリー制作者もかなり苦労された様です。
_ 1. ST7735S:V1.1:初回購入したもの。
_ 2. ST7735R:V1.4
_ 3. ST7735 :V2.1:追加購入したもので 追記のお話です。
_  経緯:当初 基板に v1.1 と書かれた物を試用し 以下のスケッチで動いた。
_   その後 他の業者から購入し V2.1 が来た。販売画面に違いの表示はない。
_  現象:画像の位置ずれが起きました。
_  V1.2 の スケッチの修正:
_  TFT の選択変更:
_   tft.initR(INITR_144GREENTAB); から tft.initR(INITR_18GREENTAB);
_   tft.setRotation(1); から tft.setRotation(3); に変更します。
_  補正追加: ctrx = tft.width()/2; ctry = tft.height()/2; の後に以下を記述。
_   ctrx = ctrx – 18; ctry = ctry -1; // 1.44 v2.1 center
_   tft.fillRect(-2,-4,127,127,ST7735_BLACK); // 1.44 v2.1 screen clear


参考:
RTClib。  Adafruit-ST7735-Library。  Adafruit_ST7735_mfGFX
adafruit-gfx-graphics-library:グラフィックの使用方法が書かれています。
TFTのサンプル:アナログ時計は「Clock_example」を使用し幾つかの追加をしました。
カラーピッカーの値算出:名前が定義されていない色の値を取得します。(例:0xFFFF)
Arduino topic:1.44 inch TFT 128×128 GLCD ILI9163:TFTを使用する為の情報


奇麗なフォントを組み込む方法:
_ Adafuruit のフォントは奇麗でないです。
_ Squix TechBlog の Daniel Eichhorn氏は Adafuruit GFX Font 用の Font Converter
_ を作られました。以下の手順で奇麗なフォントを組み込む事が出来ます。
_ FONT CREATOR NOW CREATES ADAFRUIT GFX FONTS
_ Font Converter   Daniel Eichhorn氏に感謝致します。


感想:
1. アナログ時計(Clock_exsample)は max mc costa : sumotoy氏に感謝致します。
2. 価格:TFT Display は 278円 という超低価格品です。
_   理由は Nokia 5110 に使用された大量生産品の恩恵です。
3. サイズ:1.44″ 128×128 TFT LCD Display は 45 x 33 x 4.4 mm。
_   TFT + D1 mini で13mm厚、バッテリ(6mm) + ケースで 24mm厚です。
4. TELEC:テーマによっては WiFi を必要としないものが多数あります。
_   WiFiを使用しない( WiFi.mode(WIFI_OFF); ) 事で消費電力を押さえられます。
_   ESP8266 はこれでも かなりの電流を使用するチップである事は変わりません。
5. sumotoy氏のスケッチ:アナログ表示やメーターの円形表示は sumotoy氏の方法
_   が大変参考になります。高速化の為に 全体を消去せず 針の部分のみの消去
_   と抽画を繰り返し実行しています。
6. Adafuruit のライブラリーと速度: Adafuruit のライブラリは遅いです。
_   これに挑戦した mgo-tec電子工作 の mgo-tec氏の記事は大変参考になります。
_   「ESP8266 ( ESP-WROOM-02 ) SPI 通信の高速化に挑戦
_   衝撃の高速化:是非 記事にある 動画 を見てください。
_   更に SPISSFファイル方法よりも高速な SDの高速化 も実現されています。
_   mgo-tec氏の素晴らしい挑戦と実現に感謝致します。
7. Adafruit-ST7735-Library-master の graphics test はSPI接続により速いです。
8. TFT に SD Card Socket 付きの製品が 356円という格安で販売されています。
_   1.8″ 128×160 SPI TFT LCD ST7735B with SD。 現在、調査発注中です。


スケッチ1:RTC に PC の時刻を設定する。

// DS1307 TIME SET
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
 
void setup(void) {
  WiFi.mode(WIFI_OFF);                      // TX OFF, without TELEC
  Serial.begin(115200);
  Wire.begin(D3,D4); delay(10);             // I2C, SDA,SCL
  rtc.begin();
  rtc.adjust(DateTime(__DATE__, __TIME__)); // PCの時刻を設定
}
 
void loop(){
  DateTime now = rtc.now(); 
  Serial.print  (now.year(),  DEC);Serial.print(".");
  Serial.print  (now.month(), DEC);Serial.print(".");
  Serial.print  (now.day(),   DEC);Serial.print(" ");
  Serial.print  (now.hour(),  DEC);Serial.print(":");
  Serial.print  (now.minute(),DEC);Serial.print(":");
  Serial.println(now.second(),DEC);
  delay(1000);
}

 


スケッチ2:アナログ時計

// D1 mini + 1.44" 128x128 SPI TFT + DS3231 RTC // 2016.10.03 macsbug
// https://github.com/adafruit/RTClib           // RTClib
// https://github.com/adafruit/Adafruit-ST7735-Library
// https://github.com/pkourany/Adafruit_ST7735_mfGFX
// https://cdn-learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf
// https://github.com/sumotoy/TFT_ILI9163C/tree/Pre-Release-1.0p7/examples
// http://www.barth-dev.de/online/rgb565-color-picker/
#include <ESP8266WiFi.h>                        // WiFi
#include <Wire.h>                               //
#include <RTClib.h>                             // RTC
RTC_DS3231 rtc;                                 // RTC DS3231
#include <Adafruit_GFX.h>                       //
#include <Adafruit_ST7735.h>                    // TFT 128x128 ST7735
#define TFT_CS    16                            // TFT CS  : D2 = 16
#define TFT_RST    4                            // TFT RST : D0 =  4
#define TFT_DC     5                            // TFT DC  : D5 =  5 
#define TFT_SCLK  14                            // TFT SCK : D7 = 14 
#define TFT_MOSI  13                            // TFT MOSI: D6 = 13 
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,   //
          TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); //
uint16_t ctrx, ctry;                            // center x,y of the clock
const uint16_t rad = 63;                        // radius of the clock
const float scosConst = 0.0174532925;
float sx=0, sy=1, mx=1, my=0, hx= -1, hy=0;
float sdeg = 0, mdeg = 0, hdeg = 0;
uint16_t osx, osy, omx, omy, ohx, ohy;
uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
uint16_t xd = 0, yd = 0;
uint32_t targetTime = 0;                        // for next 1 second timeout
uint8_t hh, mm, ss;                             // containers for current time
const char* wk[] = {                            // week
  "Sun","Mon","Tru","Wed","Thu","Fri","Sat"};   //
const char* tm[] = { "12","1","2","3","4","5",  // dial
  "6","7","8","9","10","11","12"};              //
  
void drawClockFace() {
  tft.fillCircle(ctrx,ctry,rad,0x3CDF);         // BLUE
  tft.fillCircle(ctrx,ctry,rad-4,0x0000);       // BLACK
  for (int i = 0; i < 360; i += 30) {           // Draw 12 lines
    sx = cos((i - 90) * scosConst);
    sy = sin((i - 90) * scosConst);
    x0 = sx * (rad - 4) + ctrx;
    yy0 = sy * (rad - 4) + ctry;
    x1 = sx * (rad - 11) + ctrx;
    yy1 = sy * (rad - 11) + ctry;
    xd = sx * (rad - 8) + ctrx - 2;             // dial pos x 
    yd = sy * (rad - 9) + ctry - 3;             // dial pos y 
    //tft.drawLine(x0, yy0, x1, yy1, 0x3CDF);   // scale
    tft.drawPixel(x0, yy0, 0xFFFF);             // scale
    String dial = "12";                         // dial
    if ( i > 0 ){ dial = String(i/30);}
    if ( dial == "12" ){ xd = xd - 3;}
    tft.setTextColor(0x3CDF);                   // BLUE
    tft.setCursor(xd, yd);
    tft.println(dial);                          // dial
  }
}

void setup(void) {
  WiFi.mode(WIFI_OFF);                          // TX OFF, without TELEC
  Wire.begin(D3, D4); delay(10);                // I2C RTC : SDA,SCL
  //--------------------------------------------//
  tft.initR(INITR_144GREENTAB);                 // TFT setup
  tft.fillScreen(ST7735_BLACK);                 //
  tft.setTextColor(0x5FCC);                     // GREEN
  tft.setRotation(1);                           //
  tft.setTextSize(1);                           //
  //--------------------------------------------//
  ctrx = tft.width()/2; ctry = tft.height()/2;
  osx = ctrx; osy = ctry;
  omx = ctrx; omy = ctry;
  ohx = ctrx; ohy = ctry;
  drawClockFace();                              // Draw clock face
  //--------------------------------------------//
  int px = 0; int py = 0;                       // apple icon
  tft.drawLine(6+px, 1+py,7+px, 1+py,0x07E0);
  tft.drawLine(5+px, 2+py,6+px, 2+py,0x07E0);
  tft.drawLine(5+px, 3+py,5+px, 3+py,0x07E0);
  tft.drawLine(2+px, 4+py,8+px, 4+py,0xFFE0);
  tft.drawLine(1+px, 5+py,9+px, 5+py,0xFFE0);
  tft.drawLine(1+px, 6+py,7+px, 6+py,0xFD24);
  tft.drawLine(1+px, 7+py,7+px, 7+py,0xFD24);
  tft.drawLine(1+px, 8+py,9+px, 8+py,0xF800);
  tft.drawLine(1+px, 9+py,9+px, 9+py,0xF800);
  tft.drawLine(2+px,10+py,8+px,10+py,0x3CDF);
  tft.drawLine(3+px,11+py,4+px,11+py,0x3CDF);
  tft.drawLine(6+px,11+py,7+px,11+py,0x3CDF);
  //--------------------------------------------//
  DateTime now = rtc.now();                     // time geting from RTC
  hh = now.hour();
  mm = now.minute();
  ss = now.second();
  targetTime = millis() + 1000;
}

void drawClockHands(uint8_t h, uint8_t m, uint8_t s) {
  // Pre-compute hand degrees, x & y coords for a fast screen update
  sdeg = s * 6;                                 // 0-59->0-354
  mdeg = m * 6  + sdeg * 0.01666667;            // 0-59->0-360:inc sec 
  hdeg = h * 30 + mdeg * 0.0833333;             // 0-11->0-360:inc min & sec
  hx = cos((hdeg - 90) * scosConst);
  hy = sin((hdeg - 90) * scosConst);
  mx = cos((mdeg - 90) * scosConst);
  my = sin((mdeg - 90) * scosConst);
  sx = cos((sdeg - 90) * scosConst);
  sy = sin((sdeg - 90) * scosConst);
  //--------------------------------------------// yyyy.mm.dd
  DateTime now = rtc.now();                     // read 
  String yd = String(now.year());               // year
  String md = String(now.month());              // month
  String dd = String(now.day());                // day
  String we = String(wk[now.dayOfTheWeek()]);   // Week
  tft.setTextColor(0x5FCC);                     //
  tft.setCursor(103,   1); tft.println(yd);     // year
  if(now.month()<10){ md = "0" + md;}           // month add 0
  if(now.day()  <10){ dd = "0" + dd;}           // day   add 0
  tft.setCursor(  1, 120); tft.println(md+dd);  // month,day
  tft.setCursor(108, 120); tft.println(we);     // week
  //--------------------------------------------//
  tft.drawLine(ohx,ohy,ctrx+1,ctry+1,0x0000);   // Erase old positions
  tft.drawLine(omx,omy,ctrx+1,ctry+1,0x0000);
  tft.drawLine(osx,osy,ctrx+1,ctry+1,0x0000);
  // Draw new hand positions
  tft.drawLine(hx*(rad-28)+ctrx+1,hy*(rad-28)
     +ctry+1,ctrx+1,ctry+1,0xFFFF);
  tft.drawLine(mx*(rad-17)+ctrx+1,my*(rad-17) 
     +ctry+1,ctrx+1,ctry+1,0xFFFF);
  tft.drawLine(sx*(rad-14)+ctrx+1,sy*(rad-14) 
     +ctry+1,ctrx+1,ctry+1,0xFA06);
  tft.fillCircle(ctrx+1,ctry+1,3,0xFA06);
  //--------------------------------------------
  osx = sx * (rad - 14) + ctrx + 1;             // Update x & y coords
  osy = sy * (rad - 14) + ctry + 1;
  omx = mx * (rad - 17) + ctrx + 1;
  omy = my * (rad - 17) + ctry + 1;
  ohx = hx * (rad - 28) + ctrx + 1;
  ohy = hy * (rad - 28) + ctry + 1;
}

void loop() {
  if (targetTime < millis()) {
   targetTime = millis() + 1000; ss++;
   if (ss == 60) { ss = 0; mm++;
     if (mm > 59) { mm = 0; hh++;
        if (hh > 23) hh = 0;
      }
    }
    drawClockHands(hh, mm, ss);
  }
}

Written by macsbug

10月 7, 2016 at 10:46 am

カテゴリー: ESP8266

DS3231 RTC in ESP8266

leave a comment »

ESP8266 + DS3231 RTC + OLED でデジタル時計を作る。                2016.10.07

ラズベリーパイ用の DS3231 For PI RTC は 小型で 約90円 という低価格です。

 


 

部品について:
これまでの DS1307 や DS3231 RTC は 電池が大きく小型化に難がありました。(左)
又 国内での価格は千円以上という高い状態。

 
ラズベリーパイ用の RTC Module は電池の直径が 9.4mmと小型です。
価格は 1個94円と低価格です。ebay。今回は10個単位の販売を購入。
10個もあると いろいろな形の物を気楽に作れるので便利になります。
  


 

国内販売価格:以下は円安(103.8円)時の価格です。購入時は1個85円でした。

No 名前 単価(円) 送料,代引  価格(円)
1 ebay:DS3231 10個 ( 939円)        94         0         94
2 ebay:DS3231 1個     102      0      102
3 アマゾン:DS3231 (Paspberry pi)  *     197   0   197
4 アマゾン:DS1307 *     295   0      295
5 aitendo:DS3231     245 790  1035
6 aitendo:DS1307     395 790  1185
7 スイッチサイエンス:DS1307 1112 150  1262
8 秋月:DS1307     750 800  1550
9 スイッチサイエンス:Sparkfun RTC 1868 150  2018

.
* :アマゾンの格安品:この業者の取り寄せ先は ebay や Aliexpress と同じですが
_  価格は ebay より高めです。,,2個買える。
メモ:ebay や Aliexpress は Free Shipping が多く送料は無料です。
_  輸送期間は 通常30日ですが物により2週間で届く物もあります。


 

動作:
時間調整は電源オン時に NTP(JST) で設定します。
WiFi が無い場合は RTCモジュールに保存された日時を使用します。


 

準備:費用総計:1416円。
_        NTP( WiFi ) を使用しなければ ( WiFi.mode(WIFI_OFF); で送信オフにする)
_        この場合 No.2 のTELECは不要で 990円となります。

No Nomen Link Price(円)  memo
1 D1 mini  ebay  327
2 ESP-WROOM-02 with TELEC  ebay  426  TELEC
3 OLED 128×64(3.3V)  ebay  569
4 DS3231 RTC (3.3V)( 電池付き )  ebay   94

 

3. 配線:D1 mini の 3.3V, D8, D7, D6 の 並んだ端子を使用する。
_     D1 mini 3.3V = DS3231 +(Vcc) = OLED Vcc。
_     D1 mini D8 = D1 mini GND = DS3231 GND = OLED GND。
_     D1 mini D7(ESP8266-13) = DS3231 C(SCL) = OLED SCL。
_     D1 mini D6(ESP8266-12) = DS3231 D(SDA) = OLED SDA。
4. 組立:D1 mini、DS3231、OLED を3段重ねにする。
5. 箱 :3D Printer にて制作。38mm x 38mm x 38mm
6. スケッチ:リストに示す。
7. 予備知識:ESP8266 + I2C DS1307 RTC + OLED
8. 予備知識:DS1307 RTC を ESP8266 + UTC(JST)で初期化する


 

加工:薄くする為の加工。
_ コネクターとバッテリーを取り除く。バッテリは平行に付けるか他の場所へ付けます。
_ 


 

メモ:
電池は使用せず USB電源を使用。
USB 5V ラインでの 消費電流は、USB式電流計にて 約50〜70mA。
電源と I2C 配線のみで簡単です。
NTPのデーター取得:udp.read(buff, NTP_PACKET_SIZE);
RTCのデーター取得:DateTime now = RTC.now();
PCの時刻を設定   :rtc.adjust(DateTime(__DATE__, __TIME__));


 

感想:
1. RTCの価格:最安値は97円から最高が2018円という、驚く程の価格差があります。
_   ebayで10個購入(939円)でも aitendo や SS の1個より遥かに安いという訳です。
_   価格が安い事と配線が4本で済みますので 全てのESP8266 に取り付けると便利です。
2. ebayの注意:RTCモジュールの写真で電池がないものがありますので注意してください。
3. ESP8266 に RTC が内蔵していれば このような事をする必要がないんですがね。
4. 最小サイズのの RTC と D1 mini を組み合わせて小型化ができました。
_   厚さは 10mm でバッテリー(6mm)とケース(4mm)を付けると 約20mm になります。


 

スケッチ:

// Watch : ESP, I2C DS1307 RTC, I2C OLED, NTP, Timeset : 2016.06.30
#include <ESP8266WiFi.h>                         // WIFI
#include <WiFiUdp.h>                             // WIFI
#include <Wire.h>                                //
#include <SPI.h>                                 //
#include <RTClib.h>                              // RTC
RTC_DS3231 RTC;                                  // RTC
#include <Adafruit_GFX.h>                        // OLED
#include <ESP_Adafruit_SSD1306.h>                // OLED
#define OLED_RESET 4                             // OLED
Adafruit_SSD1306 display(OLED_RESET);            // OLED
char ssid[] = "xxxx";                            // your network SSID
char pass[] = "xxxx";                            // your network password
unsigned int localPort = 2390;                   // local port to listen
IPAddress timeServer(129, 6, 15, 28);            // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48;                  // NTP time : first 48byte
byte buff[NTP_PACKET_SIZE];                      // incoming & out packets
WiFiUDP udp;                                     // UDP:send & rx packets
const char* y[] = {"Sun","Mon","Tru","Wed","Thu","Fri","Sat"};
 
void setup(){
  //Serial.begin(115200);
  //---------------------------------------------//
  Wire.begin(0, 2); delay(10);                   // ESP I2C : SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x78>>1);   // OLED I2C_ADDRESS
  display.clearDisplay();display.setTextSize(1); // all off, font size=1
  display.setCursor(0,0);                        // location 0,0
  display.setTextColor(WHITE);display.display(); // WHITE, display
  //---------------------------------------------//
  display.println("Mac Address");                //
  display.println(WiFi.macAddress());            // Mac Address display
  display.display();                             //
  //---------------------------------------------// WiFi
  WiFi.begin(ssid, pass);                        // WiFi SSID,PASS
  int w = 32;                                    // WiFi count
  while (WiFi.status() != WL_CONNECTED){         // WiFI Status
    delay(500);display.print(WiFi.status());     // wifi status
    display.display(); w--; if (w<0){ break;}    // wifi check/break
  }                                              //
  //---------------------------------------------// with wiFi
  udp.begin(localPort);      delay(1000);        // UDP
  sendNTPpacket(timeServer); delay(1000);        // send NTP time server
  int cb = udp.parsePacket();                    //
  if (!cb) {display.println("no packet yet");    //
            display.display();}                  //
  else {                                         //
   udp.read(buff, NTP_PACKET_SIZE);              // read packet buffer
   unsigned long hW = word(buff[40],buff[41]);   // HiWord
   unsigned long lW = word(buff[42],buff[43]);   // loWord
   unsigned long secsSince1900 = hW << 16 | lW;  //
   const unsigned long seventyYears=2208988800UL;// Convert NTP time
   unsigned long t = secsSince1900-seventyYears; // Unix time
   t = t + 32400;                                // JST=UTC+9(9*60*60)
   RTC.begin(); RTC.adjust(DateTime(t));         // RTC init & JST SETUP 
  }                                              //
}                                                //
 
void loop(){                                     //
  DateTime now = RTC.now();                      // time geting from RTC
  //---------------------------------------------//
  display.clearDisplay();display.setCursor(0,0); // disp Clear,loc 0,0
  display.setTextSize(2);                        // Font Size = 2
  //---------------------------------------------// yyyy.mm.dd
  display.print(now.year());  display.print(".");// year display
  if(now.month()<10){         display.print(0);} // mon  add 0
  display.print(now.month()); display.print(".");// mon  display
  if(now.day()  <10){         display.print(0);} // day  add 0
  display.print(now.day());                      // day  display
  //---------------------------------------------// Week
  uint8_t w=now.dayOfWeek();  String Week=y[w];  // Weak Read
  display.println(Week);display.println();       // Week
  //---------------------------------------------// Time 12:34:56
  if(now.hour()  <10){        display.print(0);} // hour add 0
  display.print(now.hour());  display.print(":");// hour display
  if(now.minute()<10){        display.print(0);} // min  add 0
  display.print(now.minute());display.print(":");// min  display
  if(now.second()<10){        display.print(0);} // sec  add 0
  display.println(now.second());                 // sec  display
  display.display();                             //
  //---------------------------------------------//
  delay(1000);                                   // 1 sec  
}                                                //
 
unsigned long sendNTPpacket(IPAddress & adrs){   // send an NTP request
  memset(buff, 0, NTP_PACKET_SIZE);              //
  buff[ 0]=0b11100011;buff[ 1]=0; buff[ 2]=6;    //
  buff[ 3]=0xEC;      buff[12]=49;buff[13]=0x4E; //
  buff[14]=49;        buff[15]=52;               // 
  udp.beginPacket(adrs, 123);                    //
  udp.write(buff, NTP_PACKET_SIZE);              //
  udp.endPacket();                               //
}

Written by macsbug

10月 6, 2016 at 11:49 pm

カテゴリー: ESP8266