Untuk sambungan sensor ke mikropengawal seperti, terdapat banyak jenis sambungan yang boleh dibuat, dan ia bergantung kepada jenis sensor. Antara protokol sambungan ialah digital, analog, serial UART dan juga I squared C (I²C) ,
Hari ini kita perkenalkan tentang Inter-Integrated circuit, atau I squared C, juga nama lainnya I2C dan IIC.
I2C ini bertindak seperti serial UART yang menggunakan dua wayar. Tetapi berlainan dengan serial UART yang menggunakan RX (penerima) dan TX (penghantar), untuk I2C, sambungnya ialah SCL (Serial clock pin) dan SDL (Serial Data Pin)
Antara kelebihan I2C ini ialah, kita boleh berkongsi satu port untuk kegunaan banyak sensor, jadi tidak terhad kepada jumlah Input/output pin yang ada pada papan pengawal.
Kita hanya perlu sambungkannya dengan I2C hub ataupun boleh juga sambungkan dengan wayar bercabang
Walaupun begitu, Bagi setiap sensor yang menggunakan I2C, telah ditetapkan alamat terbina dalam, oleh itu sekiranya kita mahu menggunakan dua sensor yang sama jenis contohnya dua LCD , terdapat sedikit masalah kerana alamatnya sama. Terdapat cara untuk menukar alamat ini, tetapi memerlukan kita untuk mengubah kod sumber bagi pustaka atau library.
Berikut adalah kod sumber arduino bagi contoh di atas.
// include semua library
#include <Tomoto_HM330X.h>
#include "rgb_lcd.h"
#include "SCD30.h"
#include <Multichannel_Gas_GMXXX.h>
#include <U8x8lib.h>
// ringkaskan objek dari library
Tomoto_HM330X airQuality;
GAS_GMXXX<TwoWire> gas;
rgb_lcd lcd;
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
// mula setup, initialise semua objek
void setup() {
Serial.begin(115200);
delay(100);
u8x8.begin();
u8x8.setPowerSave(0);
scd30.initialize();
airQuality.begin();
gas.begin();
}
// isytihar semua pemboleh ubah
double lgPPM;
String PM_25 = "";
String PM_10 = "";
String PM_100 = "";
String CO2 = "";
String temp = "";
String humidity = "";
String coPPB = "";
String PM1_oled = "";
String PM10_oled = "";
String CO_oled = "";
String temp_oled = "";
String humi_oled = "";
uint8_t len = 0;
uint8_t addr = 0;
uint8_t i;
uint32_t co_val = 0;
float sensor_volt;
float RS_gas;
float R0;
float sensorValue = 0;
float ratio;
float result[3] = {0};
//mula loop
void loop() {
//pengiraan untuk mendapatkan CO part per billion
for(int x = 0 ; x < 100 ; x++) {
sensorValue = gas.measure_CO(); // baca dari gas
}
sensor_volt = (sensorValue/1024)*3.3;
RS_gas = (3.3-sensor_volt)/sensor_volt;
R0 = 3.21; //measured on ambient air
ratio = RS_gas/R0;
co_val = gas.measure_CO();
lgPPM = (log10(ratio) * - 2.82) - 0.12;
coPPB = String(pow(10,lgPPM) * 1000);
// baca dari airQuality
if (airQuality.readSensor()) {
PM_25 = String(airQuality.std.getPM2_5());
PM_10 = String(airQuality.std.getPM1());
PM_100 = String(airQuality.std.getPM10());
}
// baca dari SCD30
if (scd30.isAvailable()) {
scd30.getCarbonDioxideConcentration(result);
CO2 = String (result[0]);
temp = String (result[1]);
humidity = String (result[2]);
}
// cetak pada serial
Serial.println("PM1.0 : "+PM_10+" ug/m3");
Serial.println("PM2.5 : "+PM_25+" ug/m3");
Serial.println("PM10 : "+PM_100+" ug/m3");
Serial.println("CO2 : "+CO2+" ppm");
Serial.println("CO : "+coPPB+" ppb");
Serial.println("Temp : "+temp+" Degree C");
Serial.println("Humi : "+humidity+" %");
Serial.println();
// cetak pada LCD
lcd.noDisplay();
lcd.begin(16, 2);
lcd.print("PM25:"+PM_25+" ug/m3");
lcd.setCursor(0, 1);
lcd.print("CO2:"+CO2+" ppm");
//gabungkan kepada String
u8x8.setFont(u8x8_font_chroma48medium8_r);
PM1_oled = "PM1 :"+PM_10+" ug/m3";
PM10_oled = "PM10 :"+PM_100+" ug/m3";
CO_oled = "CO :"+coPPB+" ppb";
temp_oled = "Temp :"+temp+" degC";
humi_oled = "Humi :"+humidity+" %";
//Tukar kepada c string dan paparkan pada OLEd
u8x8.drawString(0,2,PM1_oled.c_str());
u8x8.drawString(0,3,PM10_oled.c_str());
u8x8.drawString(0,4,CO_oled.c_str());
u8x8.drawString(0,5,temp_oled.c_str());
u8x8.drawString(0,6,humi_oled.c_str());
u8x8.refreshDisplay();
delay(5000);
}
Code language: Arduino (arduino)