STM32G031とS-5851Aで温度をシリアルに出力(ソフトウェアシリアル)(STM32)(Arduino)
x あまり正確では、ない
目的
秋月で売っている安価なS-5851A(約110円)を使って温度を出力する。
1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり
//I2C_5851_H_031_1
#include <Arduino.h>
#include <Wire.h>
//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12 // ArduinoA4
#define sclPin PA11 // ArduinoA5
#define S5851A 0x48
#define in7 PB7 // 1pin
#define DW digitalWrite
#define UART_DELAY 102 // 9600bps ok 031
//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)
//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
DW(in7, HIGH);
DW(in7, LOW);//START
delayMicroseconds(UART_DELAY);
for (int ii = 0; ii < 8; ii++) {
DW(in7, (ch >> ii) & 1 );
delayMicroseconds(UART_DELAY);
}//for
DW(in7, HIGH);//Stop
delayMicroseconds(UART_DELAY);
return (0);
}//pc_putc
//文字列の表示
int pc_printf(char *str1) {
//文字の中身がゼロか
while (*str1) {
//一文字出力
pc_putc(*str1 ++);
} //while
//戻り値
return (0);
}//pc_printf
//初期化
void setup()
{
//ポートをhiにする 初期化
pinMode(in7, OUTPUT);
DW(in7, HIGH);
//i2cの初期化
Wire.begin(sdaPin,sclPin); //STM32G031J6M6
} //setup
//メインループ
void loop()
{
int s; //センサーの値 //101
int n0; //温度 小数点以上
char data_read[8]; //バッファー
//0番目のレジスター
Wire.beginTransmission(S5851A);
Wire.write(0);
Wire.endTransmission();
delay(1);
//温度の読み込み
s = 99;
Wire.requestFrom(S5851A, 1);
while(Wire.available()) { // 要求より短いデータが来る可能性あり
s = (int)Wire.read(); // 1バイトを受信
}//while
delay(1);
//温度の表示
data_read[0] = '0' + DIV10(s); // '0'+(s/10)
data_read[1] = '0' + ( s - (DIV10(s) * 10) ); // '0'+(s%10)
data_read[2] = '\r';
data_read[3] = '\n';
data_read[4] = 0;
pc_printf(data_read); //010
//1秒の待ち
delay(1000);
} //loop
PA0がソフトウェアシリアルのバージョン
x OB(オプションビット)をリセットからGPIOにしておく
x 出来ればnBOOT_SELのチェックも外しておく
xなぜか知らないがI2Cは、古いバージョンだと動く
//I2C_5851_H_PA0_031_1
#include <Arduino.h>
#include <Wire.h>
//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12 // ArduinoA4
#define sclPin PA11 // ArduinoA5
#define S5851A 0x48
#define in7 PA0 // 1pin
#define DW digitalWrite
#define UART_DELAY 102 // 9600bps ok 031
//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)
//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
DW(in7, HIGH);
DW(in7, LOW);//START
delayMicroseconds(UART_DELAY);
for (int ii = 0; ii < 8; ii++) {
DW(in7, (ch >> ii) & 1 );
delayMicroseconds(UART_DELAY);
}//for
DW(in7, HIGH);//Stop
delayMicroseconds(UART_DELAY);
return (0);
}//pc_putc
//文字列の表示
int pc_printf(char *str1) {
//文字の中身がゼロか
while (*str1) {
//一文字出力
pc_putc(*str1 ++);
} //while
//戻り値
return (0);
}//pc_printf
//初期化
void setup()
{
//ポートをhiにする 初期化
pinMode(in7, OUTPUT);
DW(in7, HIGH);
//i2cの初期化
Wire.begin(sdaPin,sclPin); //STM32G031J6M6
} //setup
//メインループ
void loop()
{
int s; //センサーの値 //101
int n0; //温度 小数点以上
char data_read[8]; //バッファー
//0番目のレジスター
Wire.beginTransmission(S5851A);
Wire.write(0);
Wire.endTransmission();
delay(1);
//温度の読み込み
s = 99;
Wire.requestFrom(S5851A, 1);
while(Wire.available()) { // 要求より短いデータが来る可能性あり
s = (int)Wire.read(); // 1バイトを受信
}//while
delay(1);
//温度の表示
data_read[0] = '0' + DIV10(s); // '0'+(s/10)
data_read[1] = '0' + ( s - (DIV10(s) * 10) ); // '0'+(s%10)
data_read[2] = '\r';
data_read[3] = '\n';
data_read[4] = 0;
pc_printf(data_read); //010
//1秒の待ち
delay(1000);
} //loop
Author And Source
この問題について(STM32G031とS-5851Aで温度をシリアルに出力(ソフトウェアシリアル)(STM32)(Arduino)), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/19d1f89afcbaa5be054e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .