ESP32動いたみたいなので、次はディスプレイの設定 ArduinoでポチリしたSSD1306の3セットなので。ESP-WROOM-32

 

 

 

接続は基本的にArduinoと同じ。ただ書いてある文字が小さいので

 接続は

 GND   GND

    VCC   3V

    SCL    GPIO22

    SDA    GPIO21

 

Wak-techさん参照させてもらいました

 

ただ表示がArduinoとは上下さかさまに???ライブラリーの違いで何かコマンドありそうだけど。 ライブラリーをAdafruit_SSD1306でやってみた、これは暴走して勝手にリブートかかってしまいダメでした。

 

スケッチはこんな感じで

 

/*
 * ESP32 Display SSD1306のテスト 
*/
#include <Wire.h>
#include "SSD1306.h"    //ディスプレイ用ライブラリを読み込み
 
SSD1306  display(0x3c, 21, 22); //SSD1306インスタンスの作成(I2Cアドレス,SDA,SCL)
 
void setup() {
 
  display.init();    //ディスプレイを初期化
// display.setFont(ArialMT_Plain_10);    //フォントを設定
  display.setFont(ArialMT_Plain_16);    //フォントを設定
//  display.setFont(ArialMT_Plain_24);    //フォントを設定
  display.drawString(0, 0, "Hello World");    //(0,0)の位置にHello Worldを表示
  display.drawString(0, 16, "123456789A123456789B123");    //(0,0)の位置にHello Worldを表示
  display.display();   //指定された情報を描画
}
 
void loop() {
  }

 

ArduinoでとりあえずRTCとSDカードは利用できるようになったので、次はWiFi Blutoothが標準で使えて小さいESP32をやってみよう、これメモリーもArduinoより大きいし無線の技適もとれていて、2個で¥1800~1900 安い ポチリ

 

いろいろとWebサイトみてると、ほとんどArduinoと似てるみたいだし、すぐに使えるだろうと、ArduinoIDEにESP32を追加してまずは恒例のLEDピカリで作動テストから。

 

 

ボードにLEDと抵抗を挿して....おっと、まずピン番号が小さくて読めない Web見ながら

int portno=5; // デジタルポート番号
 

void setup() {
  Serial.begin(115200);
  pinMode(portno,OUTPUT);
}
 

void loop() {
  Serial.print(millis());
  Serial.print(" LED pikapika");
  Serial.println();
  for(int i=0;i<10;i++){
    digitalWrite(portno,HIGH);
    delay(50);
    digitalWrite(portno,LOW);
    delay(50);
  }
    delay(5000); 

}

コンパイルして書込み、いきなりトホホ

USB挿してポート番号も認識しているはずなのにこんな表示がでて書き込めません。

Serial port COM7
Connecting........_____....._____....._____....._____....._____....._____....._____
A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header

ESP32はArduinoと違うんですね。

Web見るとコンデンサー入れろとか書いてあったけど、結局は「Connecting.......」って表示されたときにBOOTボタンを押していれば認識して書込み開始されるみたいです。

 

それにしても書いてある字が小さい、5Vの隣がGNDに見えたので最初そこから共通のマイナスラインに引っ張っていたので、光るはずもなく。これCMDって書いてあるんだね。

GNDは6番目でした。よくしらべてからやらないとね。

まずはOK。

 

 

Arduino 初心者でも簡単にできるサミスターで温度表示させていて感じることは

正しい温度って何?

 

Weathernews社から送ってもらったハンディーの計測器ソラヨミマスタ(昔タダで送ってくれたけど今¥15,000なんだね)を基準に見てみると1~2℃程度の差は普通にある。

IMG_8798.jpg

1℃の差は大きい。差がどこで出るのか。サミスターの誤差はあるとしても、サミスタ10本ほど買って、入れ替えてみてもそれなりに揃った値が出てくるけど。どこでこんなにも差が出るのか。

サミスタの特性値B値は変わらない正しいものとして。計算式は下記でやってるので

 Rt1 = R100k * (1023 / (float)cA2 - 1.0);

 T1=1.0/(1/B_3950*log(Rt1/100000)+1/(298.15))-273.15 //100kΩの場合

                         (logはArduinoでは底はe)

 

ということで抵抗をテスタで測るとそれなりの差が出るバランス抵抗の値R100kの誤差による温度の計算値への感度はどの程度かExcelで計算
  

抵抗の誤差と温度をグラフで見ると

  

 

2%の誤差で0.5℃程度かまあ仕方ないね。

とりあえず多少の差はここの値で調整して合わせていこうかなあ。

計測器の場合はどう補正、公正してるのだろう。計装屋さんに聞いてみるか。

 

BME280や、DHT11などのセンサーモジュールは温度がそのまま出てくるけど、そっちの方がめんどくさくは無いけど、どんなものなのだろう。

ただこのモジュールだと水槽の温度は測れないから、気温や水温程度の温度ならやっぱりサミスタ使うのが一番安くていいかな。

 

Arduinoでいろいろくっつけたり外したりしながらも、なんとかなりそうなので、モニター付きの気温x3(室外2、室内1)、湿度、明るさを時刻を入れてSDに書き出すデータロガー作ってみました。

初心者のArduino電子工作

 気温、湿度、照度、は取れてSDカードに記録してる中、ボードの配線整理しようとしてたら、「パキッ!」液晶表示器AE-AQM1602A 割ってしまいまして、とりあえず予備で買っていたAE-AQM1602Y付けたもののコントラストの調整が難しく、微妙な電源電圧の変動で見えたり見えなくなったり。

で、Amazonで3個セットのOLED I2C接続のもの安かったのでポチリ

こんな感じの小さな箱に入ったものがアマゾンのプチプチ袋に3個入って送ってきました。説明書もなくただ本体だけ。なかなかArduino初心者には厳しい。

 

で、ネットで調べてまずは単体で接続してテスト。

 #include <Adafruit_SSD1306.h>

使ったら、簡単に表示できましたってところまではよかったけど。

 

さあ、今度はAE-AQM1602YをのSSD1306に入れ替えてさあプログラムも併せて書き換えてコンパイルしたら、コンパイルはできているもののメモリーが少ないですのアラート。

ボードに書き込んでみるとSetupのところでハングしていたり、勝手に再起動何回もしてみたりで トホホ。

AE-AQM1602YだとうまくSDカードに記録できていたのに。

 

プログラムの途中にSirial.print入れても、SSD1360でdisplay.printのところで暴走の様子。

ネット調べたら先人がいたものの、設定が悪いんじゃないのとか、配線違っている?とか、なかなか厳しいご意見があるサイトしか見つからずに。トホホ

 

検索ワードいろいろ変えてやってたら、英語のサイトでこんなの発見

I'm using the ssd1306_128x64_i2c example file from the 1306's library. 

It works perfectly until I add the #include SD.h line, after which it gives the allocation failed error. 

Please advise.

今まで日本語のサイトしか見てなかったけど、 「あれっ!!」これは

ここでGoogle翻訳の出番です。

ドンピシャですね。

SDライブラリとSSD1306ライブラリはどちらも大きなバッファを必要とします。それはたくさんのメモリを意味します。あなたはたくさんの記憶を持っていません。

  • SDは、セクターバッファー(コンパイル時に割り当てられる)に少なくとも512バイトを必要とします。
  • SSD1306は、(実行時に割り当てられる)ディスプレイバッファー用に少なくとも1kiBを必要とします。
  • シリアルは、TXおよびRXバッファー(コンパイル時に割り当てられる)に少なくとも128バイトを必要とします。
  • ワイヤーライブラリは、TXバッファに32バイトを必要とします。

これは合計2048の1696バイトであり、プログラム、さまざまなライブラリ、およびArduinoコア自体に必要な他の変数やもの、およびスタック(および指定された最小サイズの安全ゾーン)は考慮されていません。

Arduinoをより多くのメモリを備えたものにアップグレードするか、デザインを複数のArduinoに分割する以外に、それについてできることは何もありません。

 

っで、この回答はありがたいですね

 I was able to make it all fit by using the text-only library for the OLED.

  SSD1306Ascii Library

要はAdafruit_SSD1306.hはいろいろグラフィックできるけど、重いので文字表示だけの軽いライブラリーがあるようで。早速ダウンロードして入れ替えてみます。

 

 

 

おおおお!!!軽い。 SDカードシールドと共存できてパキッと動きました。

ただ、文字サイズが年寄りには小さすぎ。

もう少し真面目にDOC読めば何とかなるでしょう。

 

 

さあてサミスタ残りくっつけるか、気圧計はどうしよう。

ArduinoはPCとは違うね。ESP32だと楽勝みたいだ

まあ昔もMZ80Bのころは64KBのメモリーにHu-BASIC入れてパックパン入れて遊んでたんだからなあ。あの頃のメモリーのサイズ感かな。

 

今回のスケッチ
-----------------------------------------------

/*
* SSD1306 & TF Card Write Test
 *     URK Labo 
 */


//OLED Display SSD1306用軽いキャラクタライブラリー
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiAvrI2c oled;

//SD TF Card
#include <SPI.h>
#include <SD.h>
#define SD_SS 4
char *filename="DataLog.csv";

//時計
#include <DS3232RTC.h>
String Hiduke;
String Jikoku;

#include <Wire.h>  //I2C接続用

void setup() {
  Serial.begin(9600);
  Serial.println("Set Up");

  //表示初期化
  oled.begin(&Adafruit128x32, I2C_ADDRESS);  //こっちにすると文字高さ2倍
//  oled.begin(&Adafruit128x64, I2C_ADDRESS);  //これは小さくぎっちりサイズ
  oled.setFont(System5x7);      //文字フォント調べるか
  oled.clear();
  oled.println("URK");

  init_SD;    //SD接続初期化

  // ここでRTCの時刻をもとにArduinoの時刻を合わせる
  setSyncProvider(RTC.get);   
  if(timeStatus() != timeSet) {
      Serial.println("Unable to sync with the RTC");
  }
  else{
      Serial.println("RTC has set the system time");
      oled.println("RTC set system time");
      }  

  pinMode(7,OUTPUT); //動作チェック用LED
}

void loop() {
  oled.clear();

  //日付 時刻の取得
  Hiduke=String(year())+"/"+strPad2(month(),2)+"/"+strPad2(day(),2);
  Jikoku=strPad2(hour(),2)+":"+strPad2(minute(),2)+":"+strPad2(second(),2);
  oled.println(Hiduke+" "+Jikoku);

  //書込み
  File dataFile=SD.open(filename,FILE_WRITE);
  if(dataFile){
    dataFile.print(Hiduke +" "+Jikoku+",");
    dataFile.println(analogRead(A3));
    Serial.println("Written "+Hiduke +" "+Jikoku +"  " + String(analogRead(A3)));
    oled.println("  A3val=" + String(analogRead(A3)));
    Pikari(100,3);
    }
    else{
      Serial.println("Error:can't Oprn File");
      oled.println("Error:can't Oprn File");
      init_SD();
      Pikari(30,20);
    }
  dataFile.close();
  delay(5000);
}

void init_SD(){
  Serial.println("--SD init--");
  pinMode(SS,OUTPUT);
  SD.begin(SD_SS);
  delay(500);
}

 

void Pikari(int Dtime,int Dcnt){
  for (int i=0;i<Dcnt;i++){
    digitalWrite(7,HIGH);
    delay(Dtime);
    digitalWrite(7,LOW);
    delay(Dtime);
  }
}

// 数値の左側ゼロ埋め桁合わせ表示 時計表示用に
String strPad2(int num,int zeroCount){
  char tmp[256];
  char param[5] = {'%','0',(char)(zeroCount+48),'d','\0'};
  sprintf(tmp,param,num);
  return tmp;
}