WeMosを使ってみる

LM35DZ(アナログ温度センサー)+MCP3002/PCF8591+Ticker


前回、i2c(PCF8591) SPI(MCP3002)の2つのシリアル通信を同時に使ってアナログ温度センサーからデーターを読み込みました。
WeMosのスケッチを再掲します。

/*
 * LM35DZ Temperature sensor using PCF8591/MCP3002
 * http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/pcf8591-adda-converter-arduino-tutorial-1-a-simple-analog-measurement/
 *
 * MPC3002     LM35ZD     WeMos
 * VCC               ---- 3.3V
 * CLK               ---- D5(SCK)
 * Dout              ---- D6(MISO)
 * Din               ---- D7(MOSI)
 * CS                ---- D8(CS)
 * CH0    --- OUT
 *            VCC    ---- 3.3V
 *            GND    ---- GND
 *           
 * PCF8591     LM35ZD     WeMos
 * VCC               ---- 3.3V
 * SCL               ---- D1(SCL)
 * SDA               ---- D2(SDA)
 * A0                ---- GND
 * A1                ---- GND
 * A2                ---- GND
 * VSS               ---- GND
 * VDD               ---- 3.3V
 * Vref              ---- 3.3V
 * AINT0  --- OUT
 *            VCC    ---- 3.3V
 *            GND    ---- GND
 */
#include <MCP3002.h>
#include <SPI.h>
#include "Wire.h"

#define PCF8591 (0x48) // I2C bus address
#define AIn0 0x00
#define RefV  3.28

MCP3002 adc(15); // CS=15

int RawValue0 = 0;
float Voltage = 0.0;
float temp_c = 0;  // 摂氏値( ℃ )

void setup()
{
  Wire.begin(4,5); // sda=4, scl=5
  adc.begin();
  Serial.begin(9600);
}
void loop()
{
  Wire.beginTransmission(PCF8591); // Start your PCF8591
  Wire.write(AIn0); // Tell it to make an Analog Measurement
  Wire.endTransmission(); // 
  Wire.requestFrom(PCF8591, 2); // Get the Measured Data

  RawValue0=Wire.read(); // PCF8591 (Dummy)
  RawValue0=Wire.read(); // PCF8591
  Voltage = (RawValue0 * RefV )/ 255.0;
  temp_c = Voltage * 100;

//  Serial.print("Raw ADC Value = ");
//  Serial.print(RawValue0);
//  Serial.print(" Voltage[PCF8591] = ");
//  Serial.print(Voltage);
  Serial.print(" temp_c[PCF8591] = ");
  Serial.print(temp_c);

  RawValue0=adc.analogRead(0); // MCP3002
  Voltage = (RawValue0 * RefV )/ 1023.0;
  temp_c = Voltage * 100;
//  Serial.print(" Voltage[MCP3002] = ");
//  Serial.print(Voltage);
  Serial.print(" temp_c[MCP3002] = ");
  Serial.println(temp_c);

 delay(500);
 
}

Arduinoの標準の機能にTickerというのがあります。
こちらで 詳しく解説されています。
そこで、前回のスケッチをTickerで実装してみます。
回路は前回と同じで、LM35DZの出力電圧を測ります。

Ticker対応したスケッチは以下のようになります。
メインループがめちゃくちゃすっきりしました。
/*
 * LM35DZ Temperature sensor using PCF8591/MCP3002
 * http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/pcf8591-adda-converter-arduino-tutorial-1-a-simple-analog-measurement/
 *
 * MPC3002     LM35ZD     WeMos
 * VCC               ---- 3.3V
 * CLK               ---- D5(SCK)
 * Dout              ---- D6(MISO)
 * Din               ---- D7(MOSI)
 * CS                ---- D8(CS)
 * CH0    --- OUT
 *            VCC    ---- 3.3V
 *            GND    ---- GND
 *           
 * PCF8591     LM35ZD     WeMos
 * VCC               ---- 3.3V
 * SCL               ---- D1(SCL)
 * SDA               ---- D2(SDA)
 * A0                ---- GND
 * A1                ---- GND
 * A2                ---- GND
 * VSS               ---- GND
 * VDD               ---- 3.3V
 * Vref              ---- 3.3V
 * AINT0  --- OUT
 *            VCC    ---- 3.3V
 *            GND    ---- GND
 */
#include <Ticker.h>
#include <MCP3002.h>
#include <SPI.h>
#include "Wire.h"
#define PCF8591 (0x48) // I2C bus address

#define AIn0 0x00
#define RefV  3.28

MCP3002 adc(15); // CS=15

Ticker ticker1;
Ticker ticker2;

int RawValue0 = 0;
float Voltage = 0.0;
float temp_c_mcp = 0;  // 摂氏値( ℃ )
float temp_c_pcf = 0;  // 摂氏値( ℃ )

void pcf8591() {
//  Serial.print("pcd8591 : ");
//  Serial.println(millis());
  Wire.beginTransmission(PCF8591); // Start your PCF8591
  Wire.write(AIn0); // Tell it to make an Analog Measurement
  Wire.endTransmission(); //  
  Wire.requestFrom(PCF8591, 1); // Get the Measured Data

  RawValue0=Wire.read(); // PCF8591
  Voltage = (RawValue0 * RefV )/ 255.0;
  temp_c_pcf = Voltage * 100;
}

void mcp3002() {
//  Serial.print("mcp3002 : ");
//  Serial.println(millis());
  RawValue0=adc.analogRead(0); // MCP3002
  Voltage = (RawValue0 * RefV )/ 1023.0;
  temp_c_mcp = Voltage * 100;
}


void setup()
{
  Wire.begin(4,5); // sda=4, scl=5
  adc.begin();
  Serial.begin(9600);

  ticker1.attach_ms(1000, mcp3002);
  ticker2.attach_ms(1000, pcf8591);

}
void loop()
{
  Serial.print(" temp_c[PCF8591] = ");
  Serial.print(temp_c_pcf);

  Serial.print(" temp_c[MCP3002] = ");
  Serial.println(temp_c_mcp);

  delay(500);
 
}


シリアルモニターに表示される結果は前回と同じになります。


こちらの ページによるとTickerのCallBack関数内では通信処理はできないようです。
TickerのCallBack関数で、センサーから読み取った値をGlobal変数にセットして、メインループ内で通信になります。

続く...