#author("2024-04-04T15:46:04+09:00","default:pico_wiki","pico_wiki") #author("2024-04-04T17:46:55+09:00","default:pico_wiki","pico_wiki") [[pico_wiki_driver_03.py]] #code(C){{{ /********** DSM501A とarduinoの接続 #3 vcc 5v #4 vout1 pin8 #5 GND GND **********/ #include <Wire.h> int pin = 8; unsigned long duration; unsigned long starttime; unsigned long sampletime_ms = 30000; unsigned long lowpulseoccupancy = 0; float ratio = 0; float concentration = 0; unsigned int i_concentration=0; unsigned int icon=0; #define SLAVE_ADDRESS 0x15 void setup() { Serial.begin(9600); pinMode(8,INPUT); starttime = millis(); // initialize i2c as slave Wire.begin(SLAVE_ADDRESS); //Wire.setClock(400000); //400Khz i2c clock // define callbacks for i2c communication Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); } void loop() { duration = pulseIn(pin, LOW); lowpulseoccupancy = lowpulseoccupancy+duration; if ((millis()-starttime) > sampletime_ms) { ratio = lowpulseoccupancy/(sampletime_ms*10.0); // Integer percentage 0=>100 concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve i_conecentration=concentration; icon=concentration; //Serial.print(lowpulseoccupancy); // Serial.print(","); Serial.print(ratio); Serial.print(","); Serial.print(concentration); Serial.print(" _ "); Serial.println(i_concentration); Serial.println(icon); lowpulseoccupancy = 0; starttime = millis(); } } 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. } else if(cmd[0]==0x04) { // if read, read LSB of the sample rate, // if write, set LSB of the sample rate. } } 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= (i_concentration >>8) & 0xff; w= (icon >>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=concentration; 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=concentration; 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=concentration; 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=concentration; 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]); } } }}}