STM32G031とMCP3425でなんちゃってluxを液晶表示(MCP3425A0T-E/CH 16bitADC)(明るさ)


X計算間違えで約2Vで約400luxにならないといけないがたんに電圧の100倍になっている、修正予定 2倍すればよい。修正済2021/4/18

構成
STM32G031J6M6
MCP3425A0T-E/CH
NJL7502L
AQM0802A

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

参考


#include <Wire.h> //I2C library

//STM32G031J6M6
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define ADDR    0x68  // 2進数 1101000
#define I2Cadr  0x3e  // 固定

int     ii;           //ループカウンター

//初期レジスター
char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

//画面クリアレジスター
char INIT_cls[]={0x0,0x1};

//明るさをLCD表示形式に変換
char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    int a,b,c;

//  if( l_num >= 200 ) {
//    a=2;b=0;c=0;
//  } else if( l_num >= 100) {
//    a=1;b=(l_num-100) / 10;c=l_num % 10;
//  } else {
//    a=0;b= l_num / 10;c=l_num % 10;  
//  }

    // 2021/4/18 0から999まで10進数変換
    // 123の時
    // 123/10=12
    // 123-(12*10)=3
    // 12/10=1
    // 12-(1*10)=2

    b=l_num/10;
    c=l_num-(b*10);
    l_num=b;
    a=l_num/10;
    b=l_num-(a*10);
    //a=l_num/10;

    ch_hex_a_b[0] = '@';
    ch_hex_a_b[1] = '0' + a;
    ch_hex_a_b[2] = '0' + b;
    ch_hex_a_b[3] = '0' + c;
    ch_hex_a_b[4] = 0;
    return(ch_hex_a_b);
}

//i2c書き込みルーチン 2と4のみ
void i2c_led_w(char *buff1,int n){
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]); //rs 0がレジスター rs 1がデータ
  Wire.write(buff1[1]); //値1
  if( n == 4 ) {
    Wire.write(buff1[2]); //値2
    Wire.write(buff1[3]); //値3
  }
  Wire.endTransmission();
  delay(2);
}//i2c_led_w

void setup()
{
  Wire.begin(sdaPin,sclPin); //STM32G031J6M6
  //Wire.begin(); //UNO
  //Serial.begin(9600); //UNO

  //液晶の初期化
  for(ii=0;ii<11;ii++){
    i2c_led_w(&INIT_com[ii*2],2);
  } //for

  //16ビットadcの初期値の書き込み
  Wire.beginTransmission(ADDR);
    Wire.write(0b10011000); //16bit 15sps PGA x1
  Wire.endTransmission();

} //end setup

int read_data() {

    //2文字の読み込み
    Wire.requestFrom(ADDR, 2);

    //戻し
    return ( (Wire.read() << 8 ) + Wire.read() );
}

void loop()
{
  int p,s; //明るさの一時変数

  //液晶のクリア
  i2c_led_w(INIT_cls,2);

  //明るさの読み込み
  s=read_data();
  //Serial.println(s); //uno

//  // 32768/163.84=200 luxに変換
//  p=( ((s>>5)*6)  + (s>>7)  ) >> 5;
//  //Serial.println(p); //uno

  // 32768/(163.84/2)=400 luxに変換
  p=( ((s>>5)*6)  + (s>>7)  ) >> 4;
  //Serial.println(p); //uno


  //画面に表示 0から200まで
  i2c_led_w(ch_hex_a( p ) ,4);

  delay(1000);  //1秒待つ

}//loop