プロジェクトの概要
DFRobotのAC電流センサを使用したプロジェクトです。このプロジェクトでACモーター、照明機器、電子機器のAC電流の計測、モニタリングが可能となります。仕様は以下です。
入力電圧 (VCC): 3.3V-5.5V
アナログ出力電圧:0.2-2.8V DC
AC入力電圧範囲: 0-1V (AC RMS)
オープンタイプACトランスプローブ
AC電圧レンジ:0-20A
信号出力: 0-1V AC voltage, linear corresponding range 0-20A
精度: ±1%
非線形:≤±0.2%
周波数レンジ:50Hz~1kHz
ケーブル長:1m
動作温度: -25 ℃~+70 ℃
部品リスト
AC電流センサ DFRobot 1 Digi-key
GROVEの16 x 2 LCD 1 スイッチサイエンス
配線図

ソースリスト
まとめ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/i2c.h"
#include "hardware/rtc.h"
//#define PICO_DEFAULT_LED_PIN 25
#define LED_PIN PICO_DEFAULT_LED_PIN
#define ADC0_PIN 26
#define AC_RANGE 20.0f
#define I2C_PORT i2c0
#define I2C_SDA 8
#define I2C_SCL 9
//setup -------------------
//rtc ----------------------------------
//lcd -------------------------------
//adc ------------------------
const float ConversionFactor = 3.3f / (1 << 12);
void InitAdc()
{
adc_init();
adc_set_temp_sensor_enabled(true);
adc_gpio_init(ADC0_PIN);
}
float ReadOnBoardTemperature()
{
adc_select_input(4);
float tempV = (float)adc_read() * ConversionFactor;
float tempC = 27.0f - (tempV - 0.706f) / 0.001721f;
return tempC;
}
float ReadCurrent()
{
float peakVoltage = 0;
float VrmsVoltage = 0;
uint16_t rawData;
float volts;
adc_select_input(0);
for (int i = 0; i < 5; i++)
{
rawData = adc_read();
volts = rawData*ConversionFactor;
peakVoltage += volts;
sleep_ms(1);
}
peakVoltage = peakVoltage / 5.0f;
VrmsVoltage = peakVoltage * 0.707f;
/*The circuit is amplified by 2 times, so it is divided by 2.*/
VrmsVoltage = VrmsVoltage/2.0f;
float current = VrmsVoltage*AC_RANGE;
return current;
}
int main()
{
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
i2c_init(I2C_PORT, 400*1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
WaitTerminalStartup(30*1000);
printf("\nTerminal connected\n");
ScanI2CBus();
printf("I2C Scan completed\n");
lcd_init();
InitAdc();
InitRtc();
char buf[128];
datetime_t nowdt;
int presec = -1;
while (1) {
rtc_get_datetime(&nowdt);
if(presec != nowdt.sec)
{
sprintf(buf, "%02d/%02d %02d:%02d:%02d",
nowdt.month, nowdt.day, nowdt.hour,nowdt.min, nowdt.sec);
lcd_set_cursor(0, 0);
lcd_string(buf);
float current = ReadCurrent();
sprintf(buf, " AC:%8.3fA", current);
lcd_set_cursor(1, 0);
lcd_string(buf);
printf("%4d/%02d/%02d %02d:%02d:%02d AC:%8.3fA\n",
nowdt.year, nowdt.month, nowdt.day,
nowdt.hour,nowdt.min, nowdt.sec, current);
}
presec = nowdt.sec;
sleep_ms(200);
}
return 0;

コメントをお書きください