22.センサープロジェクト(6).電流センサーRaspberry Pi Pico WindowsC言語入門

プロジェクト名:CurrentSensor

プロジェクトの概要

DFRobotAC電流センサを使用したプロジェクトです。このプロジェクトで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

GROVE16 x 2 LCD                                                                     スイッチサイエンス

 

配線図

ソースリスト

まとめ

#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;