STM32C011でOLED温度計を作って遊ぶ。(SSD1306のミニ化)(MCP9701)(STM32C011J4M7)(ターゲットリセット)


x MCP9701-E/TO 販売コード 103199

STM32C011でOLED温度計を作って遊ぶ。(SSD1306のミニ化)(MCP9701)(STM32C011J4M7)(ターゲットリセット)



Arduino MCP9701 ssd1306 有機EL STM32C011



x 過去ログを見よ
x 「Arduino」関連を見てください

x PA13を使います。
x 自己責任の意味がわかる人がお読みください。
x 間違った操作を行うと二度と書き込めなくなります。
x ターゲットリセットを接続してください。
x 非常用として「3秒ルール」があり、起動後、3秒以内に接続してください。
x Arduinoのタブの使い方がわかる人
x SSD1306のアドレスは、3c固定


目的
MCP9701を使ったOLED温度計



結果


![o_cop933.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/86f3be84-1835-6fd6-75d2-3d56c4b01832.jpeg)


![o_cop934.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/890673ba-f74c-9623-3e09-de9a240983d2.jpeg)


プログラム


```c++:I2C_SSD1306_MCP9701_A_C011_1.ino



//I2C_SSD1306_MCP9701_A_C011_1


//ヘッダーファイル
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include "hh.h"


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
NA_ST7735_P display(SCREEN_WIDTH, SCREEN_HEIGHT);


//100の割り算 0から30000までは、だいたい正しい
#define DIV100(in) ((in*(65536/100*64+24))>>22)
//25の割り算 0から30000までは、だいたい正しい
#define DIV25(in) ((in*(65536/25*16+8))>>20)
//MCP9701の温度を求める x100
#define TMP(so) ((((so)*270769)-134432821)>>16)


//初期化
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin();

  //ピンの初期化 PA13
  pinMode(PA13, INPUT);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();


  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(20, 10);


  //センサーの値を読み込む
  analogReadResolution(12); // ADC 12bit mode
  int s = analogRead(PA13);   // センサーの読み取り値
  //int s;

  //センサーの値を温度に変換
  int t = TMP(s); //t = 2355;//debug
  int d1 = DIV100(t);
  int d01 = (t - (d1 * 100)); d01 = (DIV25(d01)) * 25;

  //温度の表示
  display.print(d1);

  display.print(".");

  if (d01 == 0) {
    display.print("00");
  } else {
    display.print(d01);
  }

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ
  
}//loop



```

hh.cpp


```c++:hh.cpp




//インクルド
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "hh.h"


//定義
#define NA_ST7735_P_swap(a, b)                                                     \
  (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation

#define MAX_PAGE                   (7)
#define MAX_COL                    (127)

#define COMMAND_MODE               0x80 // continuation bit is set!
#define DATA_MODE                  0x40

#define SET_COLUMN_ADDRESS         0x21 // takes two bytes, start address and end address of display data RAM
#define SET_PAGE_ADDRESS           0x22 // takes two bytes, start address and end address of display data RAM

#define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above
#define HORIZONTAL_ADDRESSING_MODE 0x00

//I2Cに書き込む
void write_s(uint8_t *str1, uint8_t len1) {

  Wire.beginTransmission(   0x3c  );

  for (int ii = 0; ii < len1; ii++) {

    //一文字出力
    Wire.write(*str1 ++);

  }//for

  Wire.endTransmission();

}//eeprom_write_s


//セットページアドレス
void setPageAddress(uint8_t start, uint8_t end)
{
  uint8_t databytes[6] = {COMMAND_MODE, SET_PAGE_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end};
  write_s(databytes, 6);
}//setPageAddress


//セットカラムアクセス
void setColumnAddress(uint8_t start, uint8_t end)
{
  uint8_t databytes[6] = {COMMAND_MODE, SET_COLUMN_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end};
  write_s(databytes, 6);
}//setColumnAddress


//セットメモリーアドレシングモード
void setMemoryAddressingMode()
{
  uint8_t databytes[4] = {COMMAND_MODE, SET_MEMORY_ADDRESSING_MODE, COMMAND_MODE, HORIZONTAL_ADDRESSING_MODE};
  //_i2c->write(_writeOpcode, databytes, 4);
  write_s(databytes, 4);
}//setMemoryAddressingMode


//定義
NA_ST7735_P::NA_ST7735_P(uint16_t w, uint16_t h)
  : Adafruit_GFX(w, h), buffer(NULL)

{
}


//バッファの解放
NA_ST7735_P::~NA_ST7735_P(void) {
  if (buffer) {
    free(buffer);
    buffer = NULL;
  }
}//~NA_ST7735_P


//初期処理
bool NA_ST7735_P::begin(void) {

  if ((!buffer) && !(buffer = (uint8_t *)malloc(WIDTH * ((HEIGHT + 7) / 8))))
    return false;

  //バッファーのクリア
  clearDisplay();

  //I2Cのポートの変更
  Wire.setSDA(19); //PA10
  Wire.setSCL(18); //PA9

  //I2Cの初期化
  Wire.begin(); //071
  delay(200);

  //OLEDの初期化1
  //0x80,0x8d,0x80,0x14,0x80,0xAF
  write_s( (uint8_t*) "\200\215\200\024\200\257", 6);
  delay(100);

  //セットメモリーアドレシングモード
  setMemoryAddressingMode();

  delay(500); //0.5秒待つ

  //画面の書き込み開始
  //display();

  return true; // Success
}//begin


//点の表示
void NA_ST7735_P::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
    // Pixel is in-bounds. Rotate coordinates if needed.
    switch (getRotation()) {
      case 1:
        NA_ST7735_P_swap(x, y);
        x = WIDTH - x - 1;
        break;
      case 2:
        x = WIDTH - x - 1;
        y = HEIGHT - y - 1;
        break;
      case 3:
        NA_ST7735_P_swap(x, y);
        y = HEIGHT - y - 1;
        break;
    }
    switch (color) {
      case NA_ST7735_P_WHITE:
        buffer[x + (y / 8) * WIDTH] |= (1 << (y & 7));
        break;
      case NA_ST7735_P_BLACK:
        buffer[x + (y / 8) * WIDTH] &= ~(1 << (y & 7));
        break;
      case NA_ST7735_P_INVERSE:
        buffer[x + (y / 8) * WIDTH] ^= (1 << (y & 7));
        break;
    }
  }
}


//バッファのクリア
void NA_ST7735_P::clearDisplay(void) {
  memset(buffer, 0, WIDTH * ((HEIGHT + 7) / 8));
}


//ゲットピクセル
bool NA_ST7735_P::getPixel(int16_t x, int16_t y) {
  return false; // Pixel out of bounds
}


//バッファーのポインター
uint8_t *NA_ST7735_P::getBuffer(void) {
  return buffer;
}


//再表示
void NA_ST7735_P::display(void) {

  setPageAddress(0, MAX_PAGE);  // all pages
  setColumnAddress(0, MAX_COL); // all columns

  uint8_t databytes[2] = {DATA_MODE, 0};
  for (int icount = 0; icount < ((128 / 8) * 64); icount++) {
    databytes[1] = buffer[ icount ];
    write_s(databytes, 2);
  }//for

}//display


```

hh.h


```c++:hh.h



#ifndef _NA_ST7735_P_H_
#define _NA_ST7735_P_H_

#include <Adafruit_GFX.h>

#ifndef NO_ADAFRUIT_NA_ST7735_P_COLOR_COMPATIBILITY
#define BLACK NA_ST7735_P_BLACK     ///< Draw 'off' pixels
#define WHITE NA_ST7735_P_WHITE     ///< Draw 'on' pixels
#define INVERSE NA_ST7735_P_INVERSE ///< Invert pixels
#endif
/// fit into the SSD1306_ naming scheme
#define NA_ST7735_P_BLACK 0   ///< Draw 'off' pixels
#define NA_ST7735_P_WHITE 1   ///< Draw 'on' pixels
#define NA_ST7735_P_INVERSE 2 ///< Invert pixels


class NA_ST7735_P : public Adafruit_GFX {
  public:

    NA_ST7735_P(uint16_t w, uint16_t h);

    ~NA_ST7735_P(void);

    bool begin(void);
    void display(void);
    void clearDisplay(void);
    void drawPixel(int16_t x, int16_t y, uint16_t color);
    bool getPixel(int16_t x, int16_t y);
    uint8_t *getBuffer(void);



  protected:

    uint8_t *buffer; ///< Buffer data used for display buffer. Allocated when
    ///< begin method is called.

};

#endif // _NA_ST7735_P_H_



```