Monitoring Kadar Gula Darah Led RGB dan LCD Nextion
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor kadar gula darah secara non invasive menggunakan sensor photodioda dan led RGB. untuk lebih jelasnya berikut adalah skema dan kodingnya.
1. Skema
2. Program Arduino IDE
#include "Wire.h"
#include <WiFi.h>
#define RXD2 16
#define TXD2 17
#define PIN_RED 35 // GPIO23
#define PIN_GREEN 32 // GPIO22
#define PIN_BLUE 33 // GPIO21
int cacah;
int dataadc;
int tanda;
void setup() {
Serial.begin(9600); // Hardware Serial for PC debugging
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur beberapa parameter yaitu Bpm SpO2 GSR Suhu Respirasi dan interface lcd nextion serta alat ini juga menggunakan IOT Blynk. untuk lebih jelasnya berikut adalah koding dan skemanya.
1. Program Arduino IDE
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <SPI.h>
#include "MAX30100.h"
MAX30100* pulseOxymeter;
float spo;
int bpm;
OneWire ds(7); // on pin 10 (a 4.7K resistor is necessary)
int m = 0;
int resp = 0;
int w = 0;
int n;
int counter = 0;
int suhux = 0;
int bpmx = 0;
int suhunya;
int led = 8;
int bt1 = 2;
int bt1x = 0;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
int voltgsr;
String txData="";
int gsrz;
int suhuz;
int bpmz;
int respirasiz;
String txData2="";
void setup() {
Serial2.begin(9600);
Serial.begin(9600);
Wire.begin();
pulseOxymeter = new MAX30100();
tampilbpm();
tampilrespirasi();
tampilsuhu();
tampilgsr();
kirim();
}
void loop() {
lcdCMD("n2.val=" + String(suhunya));
lcdCMD("n3.val=" + String(bpm));
lcdCMD("n4.val=" + String(voltgsr));
lcdCMD("n5.val=" + String(resp));
Serial.print("*");
Serial.print(bpm);
Serial.print(",");
Serial.print(spo);
Serial.print(",");
Serial.print(resp);
Serial.print(",");
Serial.print(suhunya);
Serial.print(",");
Serial.print(voltgsr);
Serial.println("#");
delay(100);
}
void tampilbpm(){
pulseoxymeter_t result = pulseOxymeter->update();
if( result.pulseDetected == true )
{
Serial.print( "BPM: " );
Serial.print( result.heartBPM );
Serial.print( " | " );
Serial.print( "SaO2: " );
Serial.print( result.SaO2 );
Serial.print( " % " );
Serial.println(counter);
bpm = result.heartBPM;
spo = result.SaO2;
}
counter++;
if((bpm > 50)&&(bpm < 200)&&(counter > 1000)){
counter = 0;
return;
}
delay(10);
tampilbpm();
}
void tampilrespirasi(){
m = m + 1;
int dataadc2 = analogRead(A1);
if ((dataadc2 > 600) && (w > 1)) {
digitalWrite(led, HIGH);
w = 0;
resp = resp + 1;
}
else if ((dataadc2 < 600) && (w < 1)) {
w = 2;
digitalWrite(led, LOW);
}
Serial.print("RESP: ");
Serial.println(resp);
delay(200);
if ( m > 300 ) {
//lcd.clear();
return;
}
tampilrespirasi();
}
void tampilsuhu(){
if ( !ds.search(addr)) {
//Serial.println("No more addresses.");
//Serial.println();
ds.reset_search();
delay(250);
return;
}
//Serial.print("ROM =");
for( i = 0; i < 8; i++) {
//Serial.write(' ');
//Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
//Serial.println("CRC is not valid!");
return;
}
//Serial.println();
//the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
//Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
//Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
//Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
//Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
//Serial.print(" Data = ");
//Serial.print(present, HEX);
//Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
//Serial.print(data[i], HEX);
//Serial.print(" ");
}
//Serial.print(" CRC=");
//Serial.print(OneWire::crc8(data, 8), HEX);
//Serial.println();
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
Tensimeter Digital Output Suara dan Input Voice Recognition Hi-Link HLK-V20
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat tensimeter digital dengan menggunakan output suara dan input menggunakan Voice Recognition. untuk sensor menggunakan tipe mpx. untuk lebih jelasnya berikut adalah skema dan kodingnya.
1. Skema
2. Program Arduino IDE
#include <Arduino.h>
#include <math.h>
#include <Wire.h>
#include <SPI.h>
#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);
SoftwareSerial mySerial(2, 3); // RX, TX
//? on light
//G off light
//9 cooling mode
//r turn on cooling
//s turn off cooling
float spo;
float bpm;
int counter;
int motor = 5;
int solenoid = 4;
int dataadc;
int tombol = 1;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;
char ch = "";
char inData;
int tempsis, tempdia;
void setup() {
Serial.begin(115200);
mySerial.begin (9600);
mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
delay(1); //wait 1ms for mp3 module to set volume
mp3_set_volume (30); //volume 0-30
lcd.clear();
lcd.begin();
lcd.noCursor();
pinMode(motor,OUTPUT);
pinMode(solenoid,OUTPUT);
pinMode(tombol,INPUT_PULLUP);
digitalWrite(motor,LOW);
digitalWrite(solenoid,LOW);
}
void loop() {
while (Serial.available() > 0)
{
char received = Serial.read();
inData += received;
// Process message when new line character is recieved
Pakan Ikan Monitor PH Turbidity Amoniak Suhu dan Monitor Water Level IOT Blynk 2.0
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa mengukur PH Turbidity Suhu dan water level via IOT Blynk. alat ini juga terdapat RTC sebagai pewaktu, jadi ketika waktu sesuai dengan setingan maka pelontar berupa servo akan aktif. berikut adalah kodingdan skemanya.
int addr1 = 0; int addr2 = 1; int addr3 = 2; int addr4 = 3; int addr5 = 4;
Time t; int jampagi,jamsiang,jamsore; float TempC; float pHValue; int tds; int adctds; int adcPH; int TempCx; int pHValuex; int ntux; float ntufix; long duration1, distance1; long duration2, distance2; int btset = 4; int btup = 8; int btdown = 7; int btok = 11; int btsetx; int btupx; int btdownx; int btokx; float batasamo; float batasph; float amoniak; int relayaerator = A2; int relayout = A3; int relayin = A6; int tanda = 0; int kolam; int tinggipakan; int tdsValue;
rtc.begin(); //rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAmy //rtc.setTime(14, 37, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(1, 1, 2014); // Set the date to January 1st, 2014
//ketinggian air kolam digitalWrite(trigPin1, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin1, HIGH); delayMicroseconds(10); // Added this line digitalWrite(trigPin1, LOW); duration1 = pulseIn(echoPin1, HIGH); distance1 = (duration1/2) / 29.1;
//ketinggian pakan ikan digitalWrite(trigPin2, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin2, HIGH); delayMicroseconds(10); // Added this line digitalWrite(trigPin2, LOW); duration2 = pulseIn(echoPin2, HIGH); distance2 = (duration2/2) / 29.1;
//kirim data yang telah diterima sebelumnya //Serial.print("data masuk : "); //Serial.print(dataIn); //Serial.print("\n");
//inisialisasi variabel, (reset isi variabel) dt[j]=""; //proses parsing data for(i=1;i<dataIn.length();i++){ //pengecekan tiap karakter dengan karakter (#) dan (,) if ((dataIn[i] == '#') || (dataIn[i] == ',')) { //increment variabel j, digunakan untuk merubah index array penampung j++; dt[j]=""; //inisialisasi variabel array dt[j] } else { //proses tampung data saat pengecekan karakter selesai. dt[j] = dt[j] + dataIn[i]; } }
Monitor PH Turbidity NTU TDS Suhu IOT Notif TELEGRAM
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur PH ,TDS ,NTU ,Turbidity ,Suhu dan notif IOT telegram untuk lebih jelasnya berikut adalah koding dan foto alatnya.
1. Foto Alat
2. Program Arduino IDE
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#define TdsSensorPin A2
#define ONE_WIRE_BUS 7
const int pHMeterPin = A0;
const int sensorTurbi = A1;
float volt;
float ntu;
float TempC;
int phx;
int suhux;
int ntux;
int tdsx;
#define VREF 5.0 // analog reference voltage(Volt) of the ADC
#define SCOUNT 30 // sum of sample point
int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC
averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
//Serial.print("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
//Serial.print("TDS Value:");
//Serial.print(tdsValue,0);
//Serial.println("ppm");
lcd.setCursor(0,2);
lcd.print("TDS: ");
lcd.print(tdsValue,0);
lcd.print(" ppm ");
}
sensors.requestTemperatures();
TempC = sensors.getTempCByIndex(0); // Celcius
lcd.setCursor(0,0);
lcd.print("pH: ");
lcd.print(pH,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("NTU: ");
lcd.print(ntu,0);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("Suhu: ");
lcd.print(TempC,0);
lcd.print(" C ");
phx = pH;
ntux = ntu;
tdsx = tdsValue;
suhux = TempC;
Serial.print("*");
Serial.print(phx);
Serial.print(",");
Serial.print(ntux);
Serial.print(",");
Serial.print(tdsx);
Serial.print(",");
Serial.print(suhux);
Serial.println("#");
delay(1000); // Wait for a second before reading again
}
float round_to_dp( float in_value, int decimal_place )
averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
//Serial.print("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
//Serial.print("TDS Value:");
//Serial.print(tdsValue,0);
//Serial.println("ppm");
lcd.setCursor(0,2);
lcd.print("TDS: ");
lcd.print(tdsValue,0);
lcd.print(" ppm ");
}
sensors.requestTemperatures();
TempC = sensors.getTempCByIndex(0); // Celcius
lcd.setCursor(0,0);
lcd.print("pH: ");
lcd.print(pH,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("NTU: ");
lcd.print(ntu,0);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("Suhu: ");
lcd.print(TempC,0);
lcd.print(" C ");
phx = pH;
ntux = ntu;
tdsx = tdsValue;
suhux = TempC;
Serial.print("*");
Serial.print(phx);
Serial.print(",");
Serial.print(ntux);
Serial.print(",");
Serial.print(tdsx);
Serial.print(",");
Serial.print(suhux);
Serial.println("#");
delay(1000); // Wait for a second before reading again
}
float round_to_dp( float in_value, int decimal_place )
Monitoring Tegangan Arus Daya Freq 2 Buah PZEM-004t dan Kendali Relay via IOT Blynk 2.0
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur arus dan tegangan menggunakan sensor PZEM-004t dan juga bisa kendali relay via IOT Blynk untuk lebih jelasnya berikut adalah koding dan skemanya.
Monitor Anemometer Lux Tegangan Arus + Suhu Humidity IOT Thingspeak
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor banyak variabel yaitu Lux Tegangan Arus + Suhu Humidity dengan IOT thingspeak. alat ini menggunakan Arduino Uno wifi sehingga mudah digunakan.
1. Program Arduino
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
#include <BH1750FVI.h>
#include "DHT.h"
#define DHTPIN 8
LiquidCrystal_I2C lcd(0x27, 16, 2);
BH1750FVI LightSensor;
uint16_t lux;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1; // minutes
unsigned long sleepTime = 15; // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps; // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing