akira.kei が 2025年12月07日00時09分13秒 に編集
初版
タイトルの変更
8ピンPICのPIC16F18313を使う(その19)I2C温湿度センサー
タグの変更
PIC
PIC16F18313
記事種類の変更
セットアップや使用方法
ライセンスの変更
(MIT) The MIT License
本文の変更
[<前の記事](https://elchika.com/article/255eb8fa-f3fd-4546-89e2-786402b65667/) : [次の記事>]() ## 温湿度センサー 仕事で湿度を測る必要があり、湿度センサーを探していたところ[なかなかいいの](https://akizukidenshi.com/catalog/g/g130207/)があったので、使い勝手を試してみた。I2C接続だからPCやMacに接続しにくいが、間にPICやArduinoを挟めばいい。とにかく動くのか確認してしたかったので、まずArduinoの繋いでみた。 [](https://akizukidenshi.com/catalog/g/g130207/) Copilotに相談しながら書いたらあっさり動いたので、センサー自体に問題がないことがまずは確認できた。 ## PC/Macと接続 Mac側はPythonで温度と湿度を表示する。MacからUSBシリアル変換でバイナリ0x05(ENQ)を送信すると、PICがI2C通信してSHT40iから6バイトの温湿度データを受け取り、そのままMacにバイナリで返す、というシンプル構成にした。  この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ということを次の記事で書こう。今日はここまで。