akira.keiのアイコン画像
akira.kei 2025年12月07日作成 © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 1
akira.kei 2025年12月07日作成 © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 1

8ピンPICのPIC16F18313を使う(その19)I2C温湿度センサー

<前の記事 : 次の記事>

温湿度センサー

仕事で湿度を測る必要があり、湿度センサーを探していたところなかなかいいのがあったので、使い勝手を試してみた。I2C接続だからPCやMacに接続しにくいが、間にPICやArduinoを挟めばいい。とにかく動くのか確認してしたかったので、まずArduinoの繋いでみた。
SHT40i
Copilotに相談しながら書いたらあっさり動いたので、センサー自体に問題がないことがまずは確認できた。

PC/Macと接続

Mac側はPythonで温度と湿度を表示する。MacからUSBシリアル変換でバイナリ0x05(ENQ)を送信すると、PICがI2C通信してSHT40iから6バイトの温湿度データを受け取り、そのままMacにバイナリで返す、というシンプル構成にした。
USB↔︎PIC↔︎SHT40i
このPythonプログラムもほとんどCopilotに書いてもらった。AIってすごい。

PIC側はMCCで...

電源に2ピン、シリアル通信に2ピン、I2Cに2ピン、LEDに1ピン、リセットに1ピンで8ピン全て使用した。まずはお手本を、ということでMCC(Microchip Code Configurator)を使ったら、比較的あっさり動いてしまった。mcc_generated_filesを直接編集するという禁じ手も使っている。

#include "mcc_generated_files/mcc.h" #include "mcc_generated_files/examples/i2c1_master_example.h" extern uint8_t rflg; uint8_t cmdbuf[1]; uint8_t datbuf[6]; #define ADDR 0x44 void main(void) { uint8_t i; SYSTEM_Initialize(); LED_SetLow(); cmdbuf[0]=0xfd; INTERRUPT_PeripheralInterruptEnable(); INTERRUPT_GlobalInterruptEnable(); while (1) { if(rflg) { rflg=0; I2C1_WriteNBytes(ADDR,cmdbuf,1); __delay_ms(75); I2C1_ReadNBytes(ADDR,datbuf,6); for(i=0;i<6;i++) putchar(datbuf[i]); } } }

禁じ手の具体的な箇所は「void EUSART_Receive_ISR(void)」内の最後に

if(getch()==0x05) { rflg=1; LED_Toggle();}

を入れただけだ。ちなみに少し上の方にある「char getch(void)」ではエラーになるので、「int getch(void)」に変更した。まぁここまではまだマシだったんだ。

Copilotの無自覚な嘘

Copilotに「PIC16F18313でMCCを使わずにプログラムを書きたい」と相談しながらプログラムを書いてみたが、PythonやArduinoでは頼りになるのに、PICでは全然ダメだったwということを次の記事で書こう。今日はここまで。

akira.keiのアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する