LoginSignup
0
0

More than 1 year has passed since last update.

STM32G031とS-5851Aで温度を液晶ACM1602K-NLW-BBWに出力

Last updated at Posted at 2021-09-04

x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!

x SWDをGPIOとして使うから上級者用
x SWD-CLK,SWD-IOをGPIOと共有する
x Bootと共有する為、注意
x リセットを接続するか3秒以内 書き込み

目的
秋月で売っている安価なS-5851A(約110円)を使って温度を出力する。

h_con39.jpg

h_con46.jpg



#include <Arduino.h>
#include <Wire.h>

//*          *****  *****  
//*         *       *    * 
//*         *       *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define S5851A 0x48

#define DW   digitalWrite

#define swdclk   PA14 // 8pin
#define swdio    PA13 // 7pin
//#define swdclk   PA11 // 5pin
//#define swdio    PA12 // 6pin
//#define swdclk   PA12 // 6pin
//#define swdio    PA11 // 5pin
//#define t_led1   PA12 // 6pin
//#define t_led2   PA11 // 5pin
//#define en       PA0  // 4pin
//#define in7      PB7  // 1pin
#define en      PB7  // 1pin

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

//              12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

void seg1(int v,int rs)
{
    for(int jj=0;jj<8;jj++){
        if( (v & b8[jj]) == 0 ){
                DW(swdio,0); //ビットが0
        } else {
                DW(swdio,1); //ビットが1
        }//endif
        DW(swdclk,1);
        DW(swdclk,0);
    }//for
    
    DW(swdio,rs);   
    DW(en,1); delay(1);  //delayMicroseconds(40);
    DW(en,0);       
}//seg1

//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        seg1( *str1 ++ , 1  );

    } //while

    //戻り値
    return(0);
}//ns_printf

int lcd_int[]={
  0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x08+0x04
};//lcd_init

void setup() {

  delay(3000); //not Delete

  //GPIO初期化
  pinMode(swdclk,OUTPUT);
  pinMode(swdio,OUTPUT);
  pinMode(en,OUTPUT);
  DW(en,0);

  //液晶の初期化
  for(int ii=0;ii<8;ii++){ 
    seg1( lcd_int[ii] , 0);delay(2);
  }//for

  seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動
  ns_printf( "START" ); delay(500);
  seg1(   0x01  , 0  ); delay(5); //画面クリア

  //i2cの初期化
  Wire.begin(sdaPin,sclPin); //STM32G031J6M6

}

char data_read[8]; //バッファー
int  tempval;      //温度

void loop() {

  //画面クリア
  //seg1(   0x01  , 0  ); 
  //delay(5);

  seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動

  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while
  delay(1);

  //7セグに表示する為の変換
  int s = tempval;
  int n0,n10,n100,n1000;

  n10   = s / 10;            // 1234 -> 123
  n0    = s - (n10 *10);     // 1234 -  1230 -> 4
  n100  = n10 / 10;          // 123  -> 12
  n10   = n10 - (n100 *10);  // 123  -  120 -> 3
  n1000 = n100 / 10;         // 12   -> 1
  n100  = n100 - (n1000*10); // 12   -  10  -> 2

  //画面に表示
  //data_read[0] = '0' + n1000;
  //data_read[1] = '0' + n100;
  data_read[0] = '0' + n10;
  data_read[1] = '0' + n0;
  data_read[2] = 0;
  ns_printf(data_read);

  //1秒待つ
  delay(1000);

} //loop


i2c関連


#include <Wire.h>


//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define S5851A 0x48



  //i2cの初期化
  Wire.begin(sdaPin,sclPin); //STM32G031J6M6


char data_read[8]; //バッファー
int  tempval;      //温度


  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while
  delay(1);

  //7セグに表示する為の変換
  int s = tempval;
  int n0,n10,n100,n1000;

  n10   = s / 10;            // 1234 -> 123
  n0    = s - (n10 *10);     // 1234 -  1230 -> 4
  n100  = n10 / 10;          // 123  -> 12
  n10   = n10 - (n100 *10);  // 123  -  120 -> 3
  n1000 = n100 / 10;         // 12   -> 1
  n100  = n100 - (n1000*10); // 12   -  10  -> 2

  //画面に表示
  //data_read[0] = '0' + n1000;
  //data_read[1] = '0' + n100;
  data_read[0] = '0' + n10;
  data_read[1] = '0' + n0;
  data_read[2] = '.';
  data_read[3] = 0;
  ns_printf(data_read);

  //1秒待つ
  delay(1000);






0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0