LoginSignup
0
0

More than 1 year has passed since last update.

STM32L010とSTTS751で液晶温度計 (Mbed)(AQM0802A) HAL

Last updated at Posted at 2021-09-12

x 愛用していたSTTS751の入手が難しくなったので代用品は、S-5851A。(おもにアドレスの違い)

x Mbedのリビジョン143

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

h_con64.jpg



#include "mbed.h"

//#define ADDR        ((0x48)<<1) //  address 5851
#define ADDR        (0x39<<1)   //  address 751
#define ADDR_LCD    (0x7C)      //  address

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁
//int     ii;             //ループカウンター
uint8_t b[]="@A";       //i2cバッファー


I2C_HandleTypeDef hi2c1;

//I2Cの初期化
void I2C_INIT1()
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        
    __HAL_RCC_I2C1_CLK_ENABLE();


    //I2C_HandleTypeDef hi2c1;

    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x00000708;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c1);    
    
    HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE);

    HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0);

}//I2C_INIT1

uint8_t INIT_com[]={
0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

uint8_t INIT_cls[]={0x0,0x1};

//メイン関数
int main()
{
    //I2Cの初期化
    I2C_INIT1();

    //液晶の初期化
    wait_ms(200);
    for(int ii=0;ii<11;ii++){
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, &INIT_com[ii*2], 2, 3000);
        wait_ms(3);
    } //for

    uint8_t b[]="@A";

    //無限ループ
    while (1) {
        //液晶のクリア
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, INIT_cls, 2, 3000);
        wait_ms(3);

        //温度センサーの初期化
        //set address 0
        b[0]=0;HAL_I2C_Master_Transmit(&hi2c1, ADDR, b, 1, 3000); //addres 0

        //温度の読み込み
        // Read temperature register
        HAL_I2C_Master_Receive(&hi2c1, ADDR, b, 1, 3000);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  b[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = DVI10(tempval);             //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力 xなぜか連続送信するとバグる為に個別送信
        // Display result
        data_read[0] = '0' + n10;
        data_read[1] = '0' + tempval;
        data_read[2] = 0; 
        for(int ii=0;ii< 2 ;ii++){
            b[0]='@';b[1]=data_read[ii];
            HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, b ,  2  , 3000);
            wait_ms(1);
        }//for

        //1秒待つ
        wait_ms(1000);
    }//while
}//main




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