Model Matematis Untuk Pengembangan Sistem Mikroprosesor

Ada banyak cara untuk membuat aplikasi pada sistem mikroprosesor.

Untuk persoalan-persoalan sederhana, dapat langsung dibuat flowchart (diagram alir) berdasarkan algoritma tertentu.

Untuk kasus-kasus spesifik, kita bisa pakai model matematis yang powerful.

Dasar-dasar matematika untuk membangun suatu perangkat lunak mikroprosesor di antaranya:

  • Matematika kontinyu, misalnya kalkulus dan matematika lain yang berbasis persamaan differensial
  • Matematika diskrit, misal graph theory, set theory, dan sebagainya
  • Matematika berbasis konsep fuzzy, untuk membangun sistem fuzzy
  • Probabilitas dan Statistika, untuk sistem-sistem yang berhadapan dengan hal-hal non deterministik.

Teknologi di bidang elektro  yang dapat dipakai:

  • Sinyal & Sistem
  • Filter analog
  • Filter digital
  • Sistem kendali , biasanya berbasis PID (Proportional, Integral Derivative)
  • Finite State Machine / State Chart
  • Artificial Intelligence, baik yang non-learning (kecerdasan diprogram) maupun machine learning (pembelajaran mesin)
  • Sistem-sistem digital yang dapat dibuat:
  • Filter digital berbasis mikroprosesor
  • Kendali digital berbasis mikroprosesor
  • Finite State Machine berbasis mikroprosesor
  • Artificial Intelligence berbasis mikroprosesor. Jika komputasinya berat, mungkin diperlukan mikroprosesor khusus seperti Jetson Nano.

Contoh model matematis untuk kasus khusus:

  • Filter digital dapat dipakai untuk membuat filter digital berbasis mikroprosesor
  • Kendali digital dapat dipakai untuk membuat pengendali digital berbasis mikroprosesor. Umumnya kendali yang dipakai adalah berbasis PID (Proportional Integral Derivative)

Mikroprosesor dan Mikrokontroler Populer

 

Beberapa mikroprosesor dan mikrokontroler populer zaman sekarang. Dari kiri: Arduino Nano, ESP32, Raspberry Pi 4, Jetson Nano. Arduino Nano dengan clock 16 MHz, mikrokontroler yang sangat populer di kalangan hobi elektronika. ESP32 punya 2 prosesor dengan clock 240 MHz. ESP32 ini komputasinya lebih powerful dibandingkan Arduino Nano, plus ada kemampuan WiFi. Populer untuk membuat aplikasi IoT (Internet of Things). Raspberry Pi prosesornya dari keluarga ARM sebanyak 4 core, clock 1 GHz, sistem operasinya Linux. Dapat dipakai menjalankan aplikasi Linux yang tidak terlalu besar. Jetson Nano berisi prosesor ARM dan dilengkapi dengan GPU (Graphical Processing Unit). Cocok untuk menjalankan aplikasi AI (Artificial Intelligence) dari jenis Deep Neural Network / Deep Learning.

Mikroprosesor/mikrokontroler ini perubahannya cepat sekali. Zaman 1990an ketika saya kuliah, benda-benda ini belum ada. Mikroprosesor yang diajarkan di kuliah masih pakai Z80 / 8051. Sekarang tiap tahun mesti ngintip-ngintip perkembangan terbaru. Kalau kuliah dasar seperti rangkaian listrik & medan elektromagnetik isinya praktis tidak berubah

Jetson Nano 2GB

Saya baru saja mendapatkan modul Jetson Nano 2GB. Rencananya board ini akan dipakai untuk percobaan dengan machine learning / artificial intelligence.

Berikut ini perbandingan ukuran fisik antara Arduino Nano, ESP32 Lolin Lite, Raspberry Pi dan Jetson Nano.

Fitur utama dari Jetson Nano ini adalah memiliki CUDA core, seperti yang dipakai di GPU (Graphical Processing Unit) untuk komputer desktop/laptop, hanya saja di Jetson Nano jumlah dan kemampuannya lebih kecil.

Referensi

Catu Daya / Adaptor Taffware GS-551

Saya baru saja mendapatkan power supply merek Taffware tipe GS-551. Fitur utama power supply ini adalah kemampuan tegangan outputnya dapat bervariasi:

  • 5 volt 3 ampere,
  • 9 volt 2 ampere
  • 12 volt 1,5 ampere

Arus besar ini diperlukan untuk modul mikroprosesor dengan kemampuan tinggi seperti catu daya Raspbery Pi 4, atau Jetson Nano.

Spesifikasi adapter ini tercantum di bodynya sebagai berikut:

Adapter Taffware GS-551

Spesifikasi

  • Input 100 ~ 240V 50/60Hz, 0.6A Max
  • Output 5V 3A, or 9V 2A or 12V 1.5A
  • Manufacturer: Shenzhen GOOD-SHE Technology CO. Ltd
  • Made In China

Perangkat Keras Untuk Pengolahan Sinyal Digital Berbasis Mikroprosesor

Pengolahan sinyal digital dapat diimplementasikan dengan mikroprosesor. Berikut ini blok diagram pengolahan sinyal digital minimalis:

Komponen Sistem

  • Pengkondisi sinyal
  • Anti aliasing filter
  • ADC (Analog to Digital Converter)
  • Mikroprosesor
  • DAC (Digital to Analog Converter)
  • Filter rekonstruksi (reconstruction filter)
  • Catu daya untuk rangkaian analog
  • Catu daya untuk rangkaian digital

Cara kerja sistem

sinyal analog masuk ke pengkondisi sinyal.

  • Pengkondisi sinyal memperkuat atau memperlemah sinyal agar tegangannya sesuai dengan tegangan masukan Anti Aliasing Filter (AAF). AAF biasanya penguatannya 1, sehingga tegangan ini sesuai juga dengan tegangan masukan pada ADC (Analog to Digital Converter). Pengkondisi sinyal juga dapat menambah atau mengurangi tegangan sesuai keperluan.
  • Anti aliasing filter (AAF) menghillangkan sinyal frekuensi tinggi untuk mencegah terjadinya aliasing pada proses sampling
  • ADC (Analog to Digital Converter) mengubah tegangan analog menjadi angka digital dengan jumlah bit tertentu.
  • Mikroprosesor mengendalikan ADC dan DAC. Data dari ADC diterima oleh mikroprosesor. Proses pengolahan sinyal digital dilakukan di mikroprosesor. Proses perhitungan sinyal mesti dilakukan dengan kecepatan pencuplikan (sampling) tertentu, tidak terlalu cepat dan juga tidak terlalu lambat. Untuk membuat frekuensi pencuplikan yang konstan, umumnya dapat menggunakan interupsi timer pada mikroprosesor, atau dapat juga menggunakan Real Time Operating System (RTOS).
  • Mikroprosesor mengirimkan sinyal dalam bentuk angka digital ke DAC.
  • DAC (Digital to Analog Converter) mengubah sinyal digital menjadi sinyal analog. Sinyal ini masih berbentuk anak tangga.
  • Filter rekonstruksi (reconstruction Filter) mengubah sinyal analog yang berbentuk anak tangga dari DAC menjadi sinyal analog yang lebih mulus. Proses pengubahan digital ke analog mempunyai efek samping mengubah respon frekuensi sinyal. Ada sinyal frekuensi tertentu yang diperlemah, ada frekuensi tertentu yang diperkuat. Untuk mengembalikan respon frekuensi ini menjadi datar, maka diperlukan filter rekonstruksi dengan respon frekuensi tertentu. Filter rekonstruksi ini bertindak sebagai equalizer.
  • Output analog diambil dari output filter rekonstruksi
  • Catu daya (power supply) bertugas menyediakan daya dengan tegangan konstan sesuai keperluan.  Umumnya dipisahkan antara catu daya rangkaian analog dan rangkaian digital, supaya noise dari rangkaian digital tidak mengganggu rangkaian analog.

Artikel Terkait

 

 

 

Sensor Ketinggian Air Dengan Tekanan

 

Sensor ketinggian air (water level sensor) yang menggunakan tekanan air untuk mengetahui ketinggian air. Prinsip fisika yang dipakai adalah hidrostatika, di mana tekanan dalam suatu wadah berisi cairan sebanding dengan kedalaman dan massa jenis cairan tersebut.

 

 

Sensor tekanan air
Sensor tekanan air

Berikut ini contoh pinout sensor ketinggian air yang sudah dilengkapi dengan antar muka RS-485

 

Sensor ini sudah dilengkapi dengan kompensasi tekanan udara. Caranya adalah dengan adanya selang udara kecil di dalam kabel penghubung ke sensor tersebut. Dengan demikian maka dapat diketahui perbedaan tekanan di dalam air dan tekanan udara di luar tangki. Dari perbedaan tekanan tersebut dapat dihitung ketinggian air pada tangki atau wadah air.

 

Sensor CO2 MH-Z19B

Sensor Winsen MH-Z19B berfungsi mengukur kadar CO2 di udara. Prinsip pengukuran menggunakan NDIR (Non Dispersive Infrared). Fitur utama: selektivitas tinggi, tidak tergantung oksigen, masa pakai panjang. Di dalamnya sudah ada kompensasi temperatur. Outputnya tersedia 3 macam, berupa sinyal digital serial asinkron, sinyal digital PWM (pulse width modulation) dan tegangan analog.

Kadar CO2 di udara dapat dipakai untuk indikator kualitas ventilasi di suatu ruangan. Ventilasi yang baik ini penting untuk mengurangi penularan COVID-19.

Spesifikasi

Product Model MH-Z19B
Target Gas
CO2
Working voltage 4.5~ 5.5 V DC
Average current < 60mA(@5V)
Peak current 150mA (@5V)
Interface level 3.3 V(Compatible with 5V)
Measuring range refer to Table 2
Output signal
UART(TTL interface level 3.3V)
PWM
DAC(default 0.4-2V)
Preheat time 3 min
Response Time T90< 120 s
Working temperature
0 ~ 50 ℃
Working humidity 0~ 90% RH (No condensation)
Dimension 33 mm×20 mm×9 mm (L×W×H)
Weight 5g
Lifespan > 5 years
 

Penampakan

Berikut ini contoh sensor MH-Z19B yang dihubungkan ke prosesor ESP32 DevkitC. Pertimbangan menggunakan DevkitC adalah karena tegangan sinyal sensor adalah 3 volt namun juga memerlukan tegangan Vcc sebesar 5 volt. Board ESP32 Lolin32 Lite tidak memiliki output 5 volt, jadi agak sulit digunakan pada aplikasi ini.

Contoh Kode

Berikut ini contoh pembacaan sensor melalui port serial.

Konfigurasi port serial di ESP32 menggunakan pin 22 sebagai RXD dan pin 23 sebagai TXD. Jalur port serial dihubungkan melalui resistor 100 ohm untuk perlindungan kalau terjadi kesalahan polaritas pin TX dan RX.

// https://circuits4you.com/2018/12/31/esp32-hardware-serial2-example/

#define RXD2 22
#define TXD2 23

// These constants won't change. They're used to give names to the pins used:

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

#define LED_BUILTIN 2

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Start Devkit");
  Serial.println("Start Devkit");

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(21, OUTPUT);
}

void loop() {
  char cmd;

  Serial2.print((char)0xff); // 0 : start byte
  Serial2.print((char)0x01);
  Serial2.print((char)0x86);
  Serial2.print((char)0x00);
  Serial2.print((char)0x00);
  Serial2.print((char)0x00);
  Serial2.print((char)0x00);
  Serial2.print((char)0x00);
  Serial2.print((char)0x79); // 8: checksum

  int counter = 0;
  int co2_high, co2_low;
  int available;
  available = Serial2.available();
  while (available > 0) {

    // read the incoming byte:
    int incomingByte = Serial2.read();

    // say what you got:
    Serial.print(">>:");
    Serial.println(incomingByte, DEC);

    if (counter == 2) {
      co2_high = incomingByte;
    }
    if (counter == 3) {
      co2_low = incomingByte;
    }
    available = Serial2.available();

    counter++;
  }
  Serial.print("CO2: ");
  Serial.println(co2_high * 256 + co2_low);

  //  Serial.print("available: ");
  //  Serial.println(available);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(21, HIGH);
  delay(500);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(21, LOW);    // turn the LED off by making the voltage LOW
  delay(500);
}

Referensi

 

Mengukur kadar Karbondioksida Dengan Sensor CJMCU-8118

Kode

 

// https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino
// https://github.com/closedcube/ClosedCube_HDC1080_Arduino
// https://github.com/closedcube/ClosedCube_HDC1080_Arduino/blob/master/examples/hdc1080measurement/hdc1080measurement.ino

#define I2C_SDA 15
#define I2C_SCL 13
#define LED_ONBOARD 22

#include "Adafruit_CCS811.h"
#include <Arduino.h>
#include <Wire.h>
#include "ClosedCube_HDC1080.h"

Adafruit_CCS811 ccs;
ClosedCube_HDC1080 hdc1080;

void setup() {
  pinMode(LED_ONBOARD, OUTPUT);
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000);

  //wait for serial connection to open (only necessary on some boards)
  while (!Serial);

  Wire.begin(I2C_SDA, I2C_SCL);

  I2C_Scan() ; // just for verifying

  // check CCS811
  Serial.println("CCS811 test");
  if (!ccs.begin()) {
    Serial.println("Failed to start sensor! Please check your wiring.");
    while (1);
  } else {
    Serial.println("CCS811 ready");
  }


  hdc1080.begin(0x40);
  Serial.println("HDC1080");
  Serial.print("Manufacturer ID=0x");
  Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
  Serial.print("Device ID=0x");
  Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device

  hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);

}

void loop() {
  float temperature = 25;
  float pressure = 0;
  float humidity = 60; // default humidity
  float co2 = 0;
  float tvoc = 0;



  temperature = hdc1080.readTemperature();
  humidity = hdc1080.readHumidity();

  ccs.setEnvironmentalData( humidity, temperature );

  if (ccs.available()) {
    if (!ccs.readData()) {
      //      Serial.print("CO2: ");
      //Serial.print(ccs.geteCO2());
      //Serial.print("ppm, TVOC: ");
      //Serial.println(ccs.getTVOC());
      co2 = ccs.geteCO2();
      tvoc =   ccs.getTVOC();
    }
  }

  Serial.print("Temp\t");
  Serial.print(temperature);
  Serial.print("\t");

  Serial.print("Humidity\t");
  Serial.print(humidity);
  Serial.print("\t");

  Serial.print("CO2\t");
  Serial.print(co2);
  Serial.print("\t");
  Serial.print("TVOC\t");
  Serial.print(tvoc);
  Serial.println("");
  delay(500);
  digitalWrite(LED_ONBOARD, HIGH);
  delay(500);
  digitalWrite(LED_ONBOARD, LOW);
}

void I2C_Scan() {
  byte error, address;

  int nDevices;
  Serial.println("I2C Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
}

Referensi

 

Mengukur Kadar Karbondioksida Dengan Sensor CCS811 dan Mikrokontroler ESP32

Pada percobaan ini dilakukan pengukuran kadar gas CO2  (karbon dioksida) di udara dengan sensor CCS811.

Mikrokontroler yang digunakan adalah modul ESP32 Lolin32 Lite

Modul CJMCU-811 tidak dilengkapi sensor temperatur & kelembaban, sehingga perlu tambahan sensor BME280.

Kompensasi temperatur dan kelembaban untuk sensor CCS811 menggunakan sensor BME280

Berikut ini foto perangkat keras yang digunakan

Berikut ini rangkaian sistem mikroprosesornya

Berikut ini source code program yang dipakai (dengan Arduino)

// https://bitbucket.org/christandlg/bmx280mi/src/master/examples/BMx280_I2C/BMx280_I2C.ino
// BMx280_I2C.ino
//
// shows how to use the BMP280 / BMx280 library with the sensor connected using I2C.
//
// Copyright (c) 2018 Gregor Christandl
//
// connect the AS3935 to the Arduino like this:
//
// Arduino - BMP280 / BME280
// 3.3V ---- VCC
// GND ----- GND
// SDA ----- SDA
// SCL ----- SCL
// some BMP280/BME280 modules break out the CSB and SDO pins as well:
// 5V ------ CSB (enables the I2C interface)
// GND ----- SDO (I2C Address 0x76)
// 5V ------ SDO (I2C Address 0x77)
// other pins can be left unconnected.


// https://github.com/adafruit/Adafruit_CCS811
// https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino


#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;

#include <Arduino.h>
#include <Wire.h>

#define I2C_SDA 15
#define I2C_SCL 13


#include <BMx280I2C.h>

#define I2C_ADDRESS 0x76

//create a BMx280I2C object using the I2C interface with I2C Address 0x76
BMx280I2C bmx280(I2C_ADDRESS);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000);

  //wait for serial connection to open (only necessary on some boards)
  while (!Serial);

  //  Wire.begin();
  Wire.begin(I2C_SDA, I2C_SCL);

  I2C_Scan() ; // just for verifying

  // check CCS811
  Serial.println("CCS811 test");
  if (!ccs.begin()) {
    Serial.println("Failed to start sensor! Please check your wiring.");
    while (1);
  } else {
    Serial.println("CCS811 ready");
  }

  //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
  //and reads compensation parameters.
  if (!bmx280.begin())
  {
    Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
    while (1);
  }

  if (bmx280.isBME280())
    Serial.println("sensor is a BME280");
  else
    Serial.println("sensor is a BMP280");

  //reset sensor to default parameters.
  bmx280.resetToDefaults();

  //by default sensing is disabled and must be enabled by setting a non-zero
  //oversampling setting.
  //set an oversampling setting for pressure and temperature measurements.
  bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
  bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);

  //if sensor is a BME280, set an oversampling setting for humidity measurements.
  if (bmx280.isBME280())
    bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
}

void loop() {
  float temperature = 0;
  float pressure = 0;
  float humidity = 60; // default humidity
  float co2 = 0;
  float tvoc = 0;

  delay(1000);

  //start a measurement
  if (!bmx280.measure())
  {
    Serial.println("could not start measurement, is a measurement already running?");
    return;
  }

  //wait for the measurement to finish
  do
  {
    delay(100);
  } while (!bmx280.hasValue());

  //  Serial.print("Pressure: "); Serial.println(bmx280.getPressure());
  //  Serial.print("Pressure (64 bit): "); Serial.println(bmx280.getPressure64());
  //  Serial.print("Temperature: "); Serial.println(bmx280.getTemperature());

  pressure = bmx280.getPressure();
  temperature = bmx280.getTemperature();

  //important: measurement data is read from the sensor in function hasValue() only.
  //make sure to call get*() functions only after hasValue() has returned true.
  if (bmx280.isBME280())
  {
    //    Serial.print("Humidity: ");
    //    Serial.println(bmx280.getHumidity());
    humidity = bmx280.getHumidity();
  }

  ccs.setEnvironmentalData( humidity, temperature );

  if (ccs.available()) {
    if (!ccs.readData()) {
      //      Serial.print("CO2: ");
      //Serial.print(ccs.geteCO2());
      //Serial.print("ppm, TVOC: ");
      //Serial.println(ccs.getTVOC());



      co2 = ccs.geteCO2();
      tvoc =   ccs.getTVOC();
    }
  }

  Serial.print("Temp\t");
  Serial.print(temperature);
  Serial.print("\t");

  Serial.print("Humidity\t");
  Serial.print(humidity);
  Serial.print("\t");

  Serial.print("Pressure\t");
  Serial.print(pressure);
  Serial.print("\t");

  Serial.print("CO2\t");
  Serial.print(co2);
  Serial.print("\t");
  Serial.print("TVOC\t");
  Serial.print(tvoc);
  Serial.println("");
}

void I2C_Scan() {
  byte error, address;

  int nDevices;
  Serial.println("I2C Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
}

Berikut ini software versi lain

// pengukuran CO2, tanpa wifi

// https://bitbucket.org/christandlg/bmx280mi/src/master/examples/BMx280_I2C/BMx280_I2C.ino
// BMx280_I2C.ino
//
// shows how to use the BMP280 / BMx280 library with the sensor connected using I2C.
//
// Copyright (c) 2018 Gregor Christandl
//
// connect the AS3935 to the Arduino like this:
//
// Arduino - BMP280 / BME280
// 3.3V ---- VCC
// GND ----- GND
// SDA ----- SDA
// SCL ----- SCL
// some BMP280/BME280 modules break out the CSB and SDO pins as well:
// 5V ------ CSB (enables the I2C interface)
// GND ----- SDO (I2C Address 0x76)
// 5V ------ SDO (I2C Address 0x77)
// other pins can be left unconnected.


// https://github.com/adafruit/Adafruit_CCS811
// https://github.com/adafruit/Adafruit_CCS811/blob/master/examples/CCS811_test/CCS811_test.ino


#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;

#include <Arduino.h>
#include <Wire.h>
#include <BMx280I2C.h>
#include "ClosedCube_HDC1080.h"

#define I2C_SDA 15
#define I2C_SCL 13
#define I2C_ADDRESS 0x76
#define LED_ONBOARD 22

const char *ssid     = "First";
const char *password = "satu2345";

//create a BMx280I2C object using the I2C interface with I2C Address 0x76
BMx280I2C bmx280(I2C_ADDRESS);
ClosedCube_HDC1080 hdc1080;

char mac_str[20];
byte mac_byte[6];

void setup() {
  pinMode(LED_ONBOARD, OUTPUT);
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000);

  //wait for serial connection to open (only necessary on some boards)
  while (!Serial);

  //  Wire.begin();
  Wire.begin(I2C_SDA, I2C_SCL);

  I2C_Scan() ; // just for verifying

  // check CCS811
  Serial.println("CCS811 test");
  if (!ccs.begin()) {
    Serial.println("Failed to start sensor! Please check your wiring.");
    while (1);
  } else {
    Serial.println("CCS811 ready");
  }
  SetupBME280();
  SetupHDC1080();
}

void SetupBME280() {
  //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
  //and reads compensation parameters.
  if (!bmx280.begin())
  {
    Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
    while (1);
  }

  if (bmx280.isBME280())
    Serial.println("sensor is a BME280");
  else
    Serial.println("sensor is a BMP280");

  //reset sensor to default parameters.
  bmx280.resetToDefaults();

  //by default sensing is disabled and must be enabled by setting a non-zero
  //oversampling setting.
  //set an oversampling setting for pressure and temperature measurements.
  bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
  bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);

  //if sensor is a BME280, set an oversampling setting for humidity measurements.
  if (bmx280.isBME280())
    bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
}

void SetupHDC1080() {

  hdc1080.begin(0x40);
  Serial.println("HDC1080");
  Serial.print("Manufacturer ID=0x");
  Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
  Serial.print("Device ID=0x");
  Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device
  hdc1080.setResolution(HDC1080_RESOLUTION_11BIT, HDC1080_RESOLUTION_11BIT);
}

void loop() {
  float temperature = 0;
  float pressure = 0;
  float humidity = 60; // default humidity
  float co2 = 0;
  float tvoc = 0;

  if (1) {
    //start a measurement
    if (!bmx280.measure())
    {
      Serial.println("could not start measurement, is a measurement already running?");
    }
    do
    {
      delay(100);
    } while (!bmx280.hasValue());

    pressure = bmx280.getPressure();
    temperature = bmx280.getTemperature();
    //important: measurement data is read from the sensor in function hasValue() only.
    //make sure to call get*() functions only after hasValue() has returned true.
    if (bmx280.isBME280())
    {
      humidity = bmx280.getHumidity();
    }
  }
  ccs.setEnvironmentalData( humidity, temperature ); // kompensasi humidity & temperature

  if (ccs.available()) {
    if (!ccs.readData()) {
      //      Serial.print("CO2: ");
      //Serial.print(ccs.geteCO2());
      //Serial.print("ppm, TVOC: ");
      //Serial.println(ccs.getTVOC());
      co2 = ccs.geteCO2();
      tvoc =   ccs.getTVOC();
    }
  }

  Serial.print("Temp\t");
  Serial.print(temperature);
  Serial.print("\t");

  Serial.print("Humidity\t");
  Serial.print(humidity);
  Serial.print("\t");

  Serial.print("Pressure\t");
  Serial.print(pressure);
  Serial.print("\t");

  Serial.print("CO2\t");
  Serial.print(co2);
  Serial.print("\t");
  Serial.print("TVOC\t");
  Serial.print(tvoc);
  Serial.println("");

  delay(500);
  digitalWrite(LED_ONBOARD, HIGH);
  delay(500);
  digitalWrite(LED_ONBOARD, LOW);
}

void I2C_Scan() {
  byte error, address;

  int nDevices;
  Serial.println("I2C Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
}

Berikut ini contoh tampilan outputnya

13:08:18.861 -> I2C Scanning...
13:08:18.861 -> I2C device found at address 0x5A
13:08:18.896 -> I2C device found at address 0x76
13:08:18.931 -> done
13:08:18.931 -> 
13:08:18.931 -> CCS811 test
13:08:19.101 -> CCS811 ready
13:08:19.101 -> sensor is a BME280
13:08:19.135 -> HDC1080
13:08:19.135 -> Manufacturer ID=0xFFFF
13:08:19.135 -> Device ID=0xFFFF
13:08:19.239 -> Temp	30.83	Humidity	50.10	Pressure	87156.00	CO2	0.00	TVOC	0.00
13:08:20.368 -> Temp	30.83	Humidity	50.29	Pressure	91715.00	CO2	0.00	TVOC	0.00
13:08:21.464 -> Temp	30.84	Humidity	50.37	Pressure	91714.00	CO2	0.00	TVOC	0.00

 

Referensi

 

Penguat Daya untuk Motor DC Analog Dengan TDA2050

Berikut ini ide penguat daya untuk menggerakkan motor DC dengan sinyal analog

TDA2050 dikonfigurasikan sebagai buffer op amp. Tegangan input akan sama dengan tegangan output, hanya arusnya saja yang diperkuat.

TDA2050 ini normalnya dipakai untuk penguat audio. Namun bandwidthnya cukup untuk motor, motor DC perlu sinyal frekuensi 0 Hz (DC) sampai beberapa puluh Hz saja.

TDA2050 akan menjadi panas, sehingga perlu dipasang di heatsink.

Referensi

TDA2050 Sebagai Driver PWM untuk Motor DC

Berikut ini ide rangkaian driver motor DC  dengan menggunakan IC TDA2050

TDA2050 sejatinya adalah penguat kelas AB untuk aplikasi audio. Komponen yang lebih tepat untuk driver motor DC misalnya adalah L293, DRV8833 dan TB6612FNG.

Cara kerja

Tegangan PWM dari mikroprosesor. HIGH = 5 volt, LOW = 0 volt.

Tegangan 2,5 volt fungsinya sebagai referensi setengah tegangan Vcc digital. Jika menggunakan PWM dengan tegangan 3 volt, maka tegangan 2,5 volt perlu diganti dengan 1,5 volt.

Jika tegangan PWM = 5 volt, maka tegangan ini akan dibandingkan oleh TDA2050 dengan input inverting (2,5 volt). Output akan saturasi mendekati V+, yaitu 5 volt.

Jika tegangan PWM = 0 volt, maka tegangan ini akan dibandingkan oleh TDA2050 dengan input inverting (2,5 volt). Output akan saturasi mendekati V-, yaitu -5 volt.

Dioda 1N5401 fungsinya melindungi TDA2050 dari arus balik motor. Motor menggunakan arus 3 ampere, sehingga perlu menggunakan 1N5401 yang punya rating arus 3 ampere. 1N4001 memiliki rating arus kontiyu 1 ampere. 1N4001 mungkin bisa dipakai juga, asal arus balik tidak terlalu lama. Kalau mau aman, langsung saja pakai 1N5401. Jika tidak ada 1N5401 bisa diganti dengan yang rating arusnya mirip, seperti 1N5402 sampai 1N5408.

Perhatian

TDA2050 dirancang untuk penguat audio amplifier, bukan untuk motor driver. Beberapa kelemahan yang akan terjadi pada rangkaian ini:

  • efisiensi rendah
  • kecepatan switching lambat dibandingkan motor driver betulan, seperti DRV8833 dan TB6612FNG

Referensi

 

Cara Menurunkan Tegangan Baterai 3,7 volt Menjadi 3 volt

Berikut ini beberapa cara untuk menurunkan tegangan baterai 3,7 volt menjadi 3 volt

Menggunakan Switching Regulator

Cara terbaik adalah menggunakan switching regulator atau DC-to-DC converter jenis step down. Switching regulator memiliki efisiensi tinggi, sekitar 80~90%.

Salah satu regulator yang cocok adalah regulator step down tipe LM2596

DC to DC Converter step down LM2596
DC to DC Converter step down LM2596

Datasheet: https://www.ti.com/lit/ds/symlink/lm2596.pdf

Fitur:

  • Output: 3,3V 5V 12V, Adjustable
  • Output 3A
  • Input up to 40 volt
  • 150 kHz fixed frequency

Menggunakan Low Drop Regulator

Teknik lain adalah menggunakan linear regulator dari jenis ‘Low Drop Regulator’.

 

Menggunakan Dioda Zener 3,1 volt

Cara lain dengan menggunakan regulator berbasis dioda zener. Permasalahannya adalah mencari dioda zener yang tegangannya paling mendekati 3 volt.

Regulator tegangan dengan dioda zener
Regulator tegangan dengan dioda zener

Menggunakan Dioda Silikon

Dioda silikon umumnya dapat memberikan drop tegangan sebesar 0,7 volt. Menurut saya, cara ini kurang dapat diandalkan, karena tegangan pada dioda tidak selalu 0,7 volt. Dapat dipengaruhi oleh tipe dioda yang dipakai dan juga arus pada dioda tersebut.

Referensi