#author("2019-10-08T07:17:32+09:00","","")
#author("2019-10-16T15:31:03+09:00","default:nomukee-system","nomukee-system")
[[FrontPage]]
#code(C){{
/**********

MQ-3 とarduinoの接続
https://bildr.org/2013/10/mq3-arduino/

Arduino Nano        MQ-3
          GND---+---GND
                |
              10K ohm
                |
          A0----+---B1

          5V----+---H1
                |
                +---A1

Arduino Nano I2C
   SDA -> A4
   SCL -> A5
                   
**********/

#include <Wire.h>

//int pirPin = A0;
//int pirPin = 7;
int mq3_analogPin = 0;
int mq3_value=0;

unsigned long duration;
unsigned long starttime;
unsigned long sampleRate_ms = 500;

int freq;

void setup() {
  Serial.begin(9600);
  Wire.begin(0x14);// Slave ID #14
  Wire.onRequest(requestEvent);
  Wire.onReceive(receiveEvent);

//  pinMode(pirPin, INPUT);
  starttime = millis();

}

void loop() {
  mq3_value = analogRead(mq3_analogPin);

  Serial.print("mq3=");
  Serial.print(mq3_value);
  Serial.println("");
  delay(sampleRate_ms );
}

byte cmd[5];
int writeFlag;
byte wx[5];

void receiveEvent(int n) {
//  Serial.print("receiveEvent, n=");
//  Serial.print(n);
//  Serial.print(",cmd=");
  if(n>1) writeFlag=1; else writeFlag=0;
  for(int i=0; i<n; i++){
    if(Wire.available()){
      cmd[i]=Wire.read();
//      Serial.print(cmd[i],HEX);
    }
  }
//  Serial.println();
  if(!writeFlag) return;
  if(cmd[0]==0x03){ // if read, read MSB of the sample rate,
                           // if write, set MSB of the sample rate.
      unsigned int wi=sampleRate_ms;
      wx[3]=wi & 0xff; wi=wi>>8;
      wx[2]=wi & 0xff; wi=wi>>8;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      wx[2]=cmd[1];
      sampleRate_ms=(((((wx[0]<<8)|wx[1])<<8)|wx[2])<<8)<<wx[3];
//      Serial.print("sampleRate_ms=");
//      Serial.println(sampleRate_ms);
  } else if(cmd[0]==0x04) { // if read, read LSB of the sample rate,
                            // if write, set LSB of the sample rate.
      unsigned int wi=sampleRate_ms;
      wx[3]=wi & 0xff; wi=wi>>8;
      wx[2]=wi & 0xff; wi=wi>>8;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      wx[0]=cmd[1];
      sampleRate_ms=(((((wx[0]<<8)|wx[1])<<8)|wx[2])<<8)<<wx[3];
//      Serial.print("sampleRate_ms=");
//      Serial.println(sampleRate_ms);
  } 

}

void requestEvent(){
  byte w;
//  Serial.print("requestEvent, cmd=");
//  Serial.println(cmd[0],HEX);
  if(writeFlag) {
//    Serial.println("w, return.");
    return;
  }
  else{
//    Serial.println("r, ...");
  }
  if(cmd[0]==0x00) { // if read, read currentActivity
      w= (mq3_value >>8) & 0xff;
      Wire.write(w);
//      Serial.print("current=");
//      Serial.println(w);     
  } else if(cmd[0]==0x01){ // if read, read MSB of the accumulated activity;
      unsigned int wi=mq3_value;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      w=wx[0];
      Wire.write(w);
//      Serial.print("activity=");
//      Serial.print(activity);
//      Serial.print(", activity[0]=");
//      Serial.println(wx[0]);      
  } else if(cmd[0]==0x02) { // if read, read LSB of the accumulated activity;
      unsigned int wi=mq3_value;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      w=wx[1];
      Wire.write(w);
//      Serial.print("activity=");
//      Serial.print(activity);      
//      Serial.print(", activity[1]=");
//      Serial.println(wx[1]);      
  } else if(cmd[0]==0x03){ // if read, read MSB of the sample rate,
      unsigned int wi=sampleRate_ms;
      wx[3]=wi & 0xff; wi=wi>>8;
      wx[2]=wi & 0xff; wi=wi>>8;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      w=wx[2];
      Wire.write(w);
//      Serial.print("sampleRate_ms=");
//      Serial.print(sampleRate_ms);
//      Serial.print(", sampleRate_ms[2]=");
//      Serial.println(wx[2]);      
  } else if(cmd[0]==0x04) { // if read, read LSB of the sample rate,
      unsigned int wi=sampleRate_ms;
      wx[3]=wi & 0xff; wi=wi>>8;
      wx[2]=wi & 0xff; wi=wi>>8;
      wx[1]=wi & 0xff; wi=wi>>8;
      wx[0]=wi & 0xff;
      w=wx[3];
      Wire.write(w);
//      Serial.print("sampleRate_ms=");
//      Serial.print(sampleRate_ms);
//      Serial.print(", sampleRate_ms[3]=");
//      Serial.println(wx[3]);      
  }
}

}}
----
#counter

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS