Translate

Membuat ECG / EKG Electrocardiograph

Membuat ECG / EKG Electrocardiograph  

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi sinyal yang biasa disebut ECG atau EKG yang mana komponenya bisa didapat mudah dipasaran seperti ICTL084, ICLM358, untuk lebih jelasnya berikut adalah skema dan hasilnya.


a. Skema Rangkaian



b. Power Supply



c. Board Sudah Jadi




d. Video Hasilnya





Monitor Tegangan dan Arus DC (INA219) Thingspeak

Monitor Tegangan dan Arus DC (INA219) Thingspeak 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor tegangan dan arus DC dengan sensor INA219 dan VDC modul. alat ini menggunakan mikrokontroller Nodemcu ESP8266 dan menggunakan server Thingspeak untuk monitor onlinenya.  untuk lebih jelasnya berikut adalah koding dan skemanya.


a. Skema 



b. Program Arduino IDE

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Adafruit_INA219.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

float busVoltage = 0;
float arusac = 0; // Measure in milli amps
float dayaac = 0;
float vac;
float arusdc;
float dayadc;
float vdc;
int adcteg;
float tegangan;
float k = 1.2;
float resistansi;
int cacah;
float Vdcaverage;
float Idcaverage;
float resivitas;

Adafruit_INA219 sensor219; // Declare and instance of INA219


WiFiClient client;
// ThingSpeak Settings
String apiKey = "87K76FHGFJKV4VVH";
const char *ssid = "hotspothpku";
const char *pass = "123456789";
const char* server = "api.thingspeak.com";
const char* resource = "/update?api_key=";

 
void setup() {
  Serial.begin(9600);
  sensor219.begin();
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  
  //setting ke online
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED){\
    delay(200);
    Serial.println(".");
    }
  Serial.println("");
  Serial.println("WiFi connected");

}
 
void loop() {

cacah++;
 
    sensor219.begin();
    busVoltage = sensor219.getBusVoltage_V();
    arusdc = sensor219.getCurrent_mA();
    arusdc = (arusdc / 10.0) * -1;
    
    adcteg = analogRead(A0);
    tegangan = (adcteg * (5.0 / 1023.0) * 4.8) - 3.1;

    Idcaverage = arusdc + Idcaverage;
    Vdcaverage = tegangan + Vdcaverage;
    
    if(cacah > 5){
    cacah = 0;  
    Idcaverage = (Idcaverage / 5.0) - 0.13 ;
    Vdcaverage = Vdcaverage / 5.0;
    resistansi = Vdcaverage / Idcaverage;
    resivitas = k * resistansi;
    
    lcd.setCursor(0,0);
    lcd.print("V= ");
    lcd.print(Vdcaverage);
    lcd.print("  ");
    lcd.setCursor(0,1);
    lcd.print("I= ");
    lcd.print(Idcaverage);
    lcd.print("  ");
    lcd.setCursor(0,2);
    lcd.print("Resiv= ");
    lcd.print(resivitas);
    lcd.print("  ");
    lcd.setCursor(0,3);
    lcd.print("Resis= ");
    lcd.print(resistansi);
    lcd.print("  ");
    
    kirim();
    
    Idcaverage = 0;
    Vdcaverage = 0;
    }

 
delay(200);   
}


void kirim(){
  
 if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
 
                      {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(Vdcaverage);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + Vdcaverage + "&field2=" + Idcaverage + "&field3=" + resistansi + "&field4=" + resivitas + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                                       
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                         
                             Serial.println(". Send to Thingspeak.");
                        }
                       
          client.stop();

          Serial.println("Waiting...");
 
  // thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(10000);
    
}



c. VIDEO HASILNYA




Komunikasi Antar ESP32 / ESP8266 Menggunakan WIFI dan IP LOCAL

Komunikasi Antar ESP32 / ESP8266 Menggunakan WIFI dan IP LOCAL


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan komunikasi wifi, jadi terdapat 2 board ESP32 yang mengirimkan data suhu kepada board ESP32 Receiver, kemudian dari board ESP32 receiver data di tampilkan ke web browser dengan menggunakan IP Local. untuk lebih jelasnya berikut adalah koding dan skemanya.



1. ESP32 Transmitter




2. ESP32 Receiver




3. Setelah dipasang sensor DS18b20 ke ESP32 kemudian lakukan pembacaan MAC ADDRESS ESP32 Receiver dahulu dengan menggunakan koding berikut, maka akan tampil di serial monitor seperti gambar dibawah, jangan lupa tekan dulu tombol EN di board ESP32

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}






4. Setelah dapat MAC Address Receiver ESP32 kemudian upload koding transmitter berikut ke Board ESP32 sebagai Transmitter dan ubah MAC Address sesuai dengan MAC Address Receiver

#include <esp_now.h>
#include <esp_wifi.h>
#include <WiFi.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <SPI.h>
#define ONE_WIRE_BUS 17  //D3 pin of nodemcu

// Set your Board ID (ESP32 Sender #1 = BOARD_ID 1, ESP32 Sender #2 = BOARD_ID 2, etc)
#define BOARD_ID 1

// Digital pin connected to the DHT sensor
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float t;
 
//MAC Address of the receiver 
uint8_t broadcastAddress[] = {0x94, 0x3C, 0xC6, 0x33, 0x81, 0xD0}; 

//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
    int id;
    float temp;
    int readingId;
} struct_message;

//Create a struct_message called myData
struct_message myData;

unsigned long previousMillis = 0;   // Stores last time temperature was published
const long interval = 10000;        // Interval at which to publish sensor readings

unsigned int readingId = 0;

// Insert your SSID
constexpr char WIFI_SSID[] = "Mipad";

int32_t getWiFiChannel(const char *ssid) {
  if (int32_t n = WiFi.scanNetworks()) {
      for (uint8_t i=0; i<n; i++) {
          if (!strcmp(ssid, WiFi.SSID(i).c_str())) {
              return WiFi.channel(i);
          }
      }
  }
  return 0;
}

float readDSTemperature() {
  sensors.requestTemperatures();
  t = sensors.getTempCByIndex(0);

    if (isnan(t)) {    
    Serial.println("Failed to read from DS sensor!");
    return 0;
  }
  else {
    Serial.println(t);
    return t;
  }
  
}


// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
 
void setup() {
  //Init Serial Monitor
  Serial.begin(115200);

  sensors.begin();
 
  // Set device as a Wi-Fi Station and set channel
  WiFi.mode(WIFI_STA);

  int32_t channel = getWiFiChannel(WIFI_SSID);

  WiFi.printDiag(Serial); // Uncomment to verify channel number before
  esp_wifi_set_promiscuous(true);
  esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);
  esp_wifi_set_promiscuous(false);
  WiFi.printDiag(Serial); // Uncomment to verify channel change after

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);
  
  //Register peer
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.encrypt = false;
  
  //Add peer        
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // Save the last time a new reading was published
    previousMillis = currentMillis;
    //Set values to send
    myData.id = BOARD_ID;
    myData.temp = readDSTemperature();
    myData.readingId = readingId++;
     
    //Send message via ESP-NOW
    esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
    if (result == ESP_OK) {
      Serial.println("Sent with success");
    }
    else {
      Serial.println("Error sending the data");
    }
  }
}



5. Kemudian Upload koding ESP32 Receiver berikut.

#include <esp_now.h>
#include <WiFi.h>
#include "ESPAsyncWebServer.h"
#include <Arduino_JSON.h>

// Replace with your network credentials (STATION)
const char* ssid = "Mipad";
const char* password = "123456789";

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  int id;
  float temp;
  float hum;
  unsigned int readingId;
} struct_message;

struct_message incomingReadings;

JSONVar board;

AsyncWebServer server(80);
AsyncEventSource events("/events");

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) { 
  // Copies the sender mac address to a string
  char macStr[18];
  Serial.print("Packet received from: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
  
  board["id"] = incomingReadings.id;
  board["temperature"] = incomingReadings.temp;
  board["humidity"] = incomingReadings.hum;
  board["readingId"] = String(incomingReadings.readingId);
  String jsonString = JSON.stringify(board);
  events.send(jsonString.c_str(), "new_readings", millis());
  
  Serial.printf("Board ID %u: %u bytes\n", incomingReadings.id, len);
  Serial.printf("t value: %4.2f \n", incomingReadings.temp);
  Serial.printf("h value: %4.2f \n", incomingReadings.hum);
  Serial.printf("readingID value: %d \n", incomingReadings.readingId);
  Serial.println();
}

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>ESP-NOW DASHBOARD</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    p {  font-size: 1.2rem;}
    body {  margin: 0;}
    .topnav { overflow: hidden; background-color: #2f4468; color: white; font-size: 1.7rem; }
    .content { padding: 20px; }
    .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
    .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
    .reading { font-size: 2.8rem; }
    .packet { color: #bebebe; }
    .card.temperature { color: #fd7e14; }
    .card.humidity { color: #1b78e2; }
  </style>
</head>
<body>
  <div class="topnav">
    <h3>MONITOR SUHU</h3>
  </div>
  <div class="content">
    <div class="cards">
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> BOARD #1 - TEMPERATURE</h4><p><span class="reading"><span id="t1"></span> &deg;C</span></p><p class="packet">Reading ID: <span id="rt1"></span></p>
      </div>
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> BOARD #2 - TEMPERATURE</h4><p><span class="reading"><span id="t2"></span> &deg;C</span></p><p class="packet">Reading ID: <span id="rt2"></span></p>
      </div>
    </div>
  </div>
<script>
if (!!window.EventSource) {
 var source = new EventSource('/events');
 
 source.addEventListener('open', function(e) {
  console.log("Events Connected");
 }, false);
 source.addEventListener('error', function(e) {
  if (e.target.readyState != EventSource.OPEN) {
    console.log("Events Disconnected");
  }
 }, false);
 
 source.addEventListener('message', function(e) {
  console.log("message", e.data);
 }, false);
 
 source.addEventListener('new_readings', function(e) {
  console.log("new_readings", e.data);
  var obj = JSON.parse(e.data);
  document.getElementById("t"+obj.id).innerHTML = obj.temperature.toFixed(2);
  document.getElementById("h"+obj.id).innerHTML = obj.humidity.toFixed(2);
  document.getElementById("rt"+obj.id).innerHTML = obj.readingId;
  document.getElementById("rh"+obj.id).innerHTML = obj.readingId;
 }, false);
}
</script>
</body>
</html>)rawliteral";

void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);

  // Set the device as a Station and Soft Access Point simultaneously
  WiFi.mode(WIFI_AP_STA);
  
  // Set device as a Wi-Fi Station
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Setting as a Wi-Fi Station..");
  }
  Serial.print("Station IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Wi-Fi Channel: ");
  Serial.println(WiFi.channel());

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });
   
  events.onConnect([](AsyncEventSourceClient *client){
    if(client->lastId()){
      Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
    }
    // send event with message "hello!", id current millis
    // and set reconnect delay to 1 second
    client->send("hello!", NULL, millis(), 10000);
  });
  server.addHandler(&events);
  server.begin();
}
 
void loop() {
  static unsigned long lastEventTime = millis();
  static const unsigned long EVENT_INTERVAL_MS = 5000;
  if ((millis() - lastEventTime) > EVENT_INTERVAL_MS) {
    events.send("ping",NULL,millis());
    lastEventTime = millis();
  }
}



6. Setelah itu buka serial monitor lalu tekan EN pada board ESP32 Receiver maka akan tampil IP Address, kemudian ketikkan IP tersebut pada web browser maka tampilannya akan seperti beriku ini.






7. VIDEO HASILNYA




Link sumber referensi:
https://randomnerdtutorials.com/esp32-esp-now-wi-fi-web-server/




Tensimeter Digital IOT Thingspeak Arduino

Tensimeter Digital IOT Thingspeak Arduino

      Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah tensimeter digital dengan menggunakan Wemos D1 mini, alat ini mengukur sistole dan diastole kemudian nilai tersebut akan dikirimkan ke server Thingspeak secara realtime, untuk lebih jelasnya berikut adalah skema dan kodingnya.

 

a. Skema


b.Program Tensi Arduino IDE Thingspeak

#include <Arduino.h>
#include <math.h>
#include <Wire.h>    
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

WiFiClient client;
// ThingSpeak Settings
String apiKey = "HUAGGJ96F2RNAX30";
const char *ssid = "hotspothpku";
const char *pass = "123456789";
const char* server = "api.thingspeak.com";
const char* resource = "/update?api_key=";

float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D3;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;

void setup() {
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  Serial.begin(9600);

 //setting ke online
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED){\
    delay(200);
    Serial.println(".");
    }
  Serial.println("");
  Serial.println("WiFi connected");
 
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);

 lcd.setCursor(0,0);
 lcd.print("S=   D= ");
}

void loop() {
 dataadc = analogRead(A0);
 mmhgx = (dataadc - 46.222) / 3.2;

 lcd.setCursor(0,0);
 lcd.print("S= ");
 lcd.print(sistolex);
 lcd.print(" D= ");
 lcd.print(diastolex);
 lcd.print("    ");
     
 tombolx = digitalRead(tombol);

 if(tombolx == LOW){
  mark = 0;
  lcd.clear();
  delay(1000);
  digitalWrite(motor,HIGH);
  digitalWrite(solenoid,HIGH);
  mulai();
  }
    
delay(10);
}

void mulai(){
 
 dataadc = analogRead(A0);
 mmhg = (dataadc - 46.222) / 3.2;

if((mmhg >= mmhgx + 3)&&(mmhg > 100)&&(mark == 0)){
//digitalWrite(motor,LOW);
Serial.println("SISTOLE");
sistole = mmhg;
mark = 2;
digitalWrite(motor,LOW);
}

if((mmhg >= mmhgx + 1)&&(mmhg > 50)&&(mmhg < 90)&&(mark == 2)){
//digitalWrite(motor,LOW);
Serial.println("DIASTOLE");
diastole = mmhg;
mark = 3;
}

 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(mmhg);
 lcd.print("     ");

if(mmhg >= 150)
{
 digitalWrite(motor,LOW);   
}

mmhgx = mmhg;

Serial.println(mmhg);

if((mark == 3)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = diastole;
digitalWrite(solenoid,LOW);
kirimdata();
return;  
}

delay(1);   
mulai();  
}

void kirimdata(){
 
 if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
 
                      {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(sistolex);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + sistolex + "&field2=" + diastolex + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                                       
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                         
                             Serial.println(". Send to Thingspeak.");
                        }
                       
          client.stop();

          Serial.println("Waiting...");
 
  // thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(10000);
 
}
 

c. Program Tensi Arduino Tanpa Thingspeak

#include <Arduino.h>
#include <math.h>
#include <Wire.h>    
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D3;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;

void setup() {
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  Serial.begin(9600);
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);

 lcd.setCursor(0,0);
 lcd.print("S=   D= ");
}

void loop() {
 dataadc = analogRead(A0);
 mmhgx = (dataadc - 46.222) / 3.2;

 lcd.setCursor(0,0);
 lcd.print("S= ");
 lcd.print(sistolex);
 lcd.print(" D= ");
 lcd.print(diastolex);
 lcd.print("    ");
     
 tombolx = digitalRead(tombol);

 if(tombolx == LOW){
  mark = 0;
  lcd.clear();
  delay(1000);
  digitalWrite(motor,HIGH);
  digitalWrite(solenoid,HIGH);
  mulai();
  }
    
delay(10);
}

void mulai(){
 
 dataadc = analogRead(A0);
 mmhg = (dataadc - 46.222) / 3.2;

if((mmhg >= mmhgx + 3)&&(mmhg > 100)&&(mark == 0)){
//digitalWrite(motor,LOW);
Serial.println("SISTOLE");
sistole = mmhg;
mark = 2;
digitalWrite(motor,LOW);
}

if((mmhg >= mmhgx + 1)&&(mmhg > 50)&&(mmhg < 90)&&(mark == 2)){
//digitalWrite(motor,LOW);
Serial.println("DIASTOLE");
diastole = mmhg;
mark = 3;
}

 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(mmhg);
 lcd.print("     ");

if(mmhg >= 150)
{
 digitalWrite(motor,LOW);   
}

mmhgx = mmhg;

Serial.println(mmhg);

if((mark == 3)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = diastole;
digitalWrite(solenoid,LOW);
return;  
}

delay(1);   
mulai();  
}
 

d. Program Kalibrasi Tensi

#include <Arduino.h>
#include <math.h>
#include <Wire.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D3;
int tombolx;
int hitung;
float vol;
float kpa;
float mmhg;

void setup() {
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  Serial.begin(9600);
  pinMode(motor,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);
}

void loop() {

 tombolx = digitalRead(tombol);

 if(tombolx == LOW){
  digitalWrite(motor,HIGH);
  }

 if(tombolx == HIGH){
  digitalWrite(motor,LOW);
  }  
    
dataadc = analogRead(A0);
mmhg = (dataadc - 46.222) / 3.2;

if(mmhg < 0){
  mmhg = 0;
  }

 lcd.setCursor(0,0);
 lcd.print("ADC= ");
 lcd.print(dataadc);
 lcd.print("     ");
 lcd.setCursor(0,1);
 lcd.print("mmHg= ");
 lcd.print(mmhg);
 lcd.print("     ");
 
 delay(200);
}

 

e. VIDEO HASILNYA


ALAT DETEKSI 6 TELUR BAGUS / JELEK ARDUINO THINGSPEAK IOT OUTPUT SUARA DF-PLAYER MODULE

ALAT DETEKSI 6 TELUR BAGUS / JELEK ARDUINO THINGSPEAK IOT OUTPUT SUARA DF-PLAYER MODULE
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi 6 buah telur secara bersamaan menggunakan Arduino. alat ini memiliki fitur yang dapat mengirimkan data hasil pembacaan sensor ke server thingspeak. untuk lebih jelasnya berikut adalah komponen dan kodingnya.
 
 
a. Komponen 

- Arduino Mega Wifi
- Timbangan Loadcell Hx711
- Lcd 16x2 I2C
- Modul Sensor Photodioda
- Led HPL Putih
- Power Supply Switching
- DF Player Mini
- Speaker
 

 
 
b. Program Arduino Uno 

#include <Wire.h>
#include "HX711.h"
#include <DFPlayer_Mini_Mp3.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

SoftwareSerial mySerial(2, 3); // RX, TX

HX711 scale(4, 5);       

float tera = 0;
float berat;
float fix;
int x;
int telur1;
int telur2;
int telur3;
int telur4;
int telur5;
int telur6;
int tombol = 7;
int tombolx;
int batastelur = 900;

void setup() {

  Serial.begin(9600);
  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.begin();
  lcd.clear();
  lcd.noCursor();
 
  scale.set_scale(2280.f);       // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                  // reset the scale to 0

   lcd.setCursor (0,0);
   lcd.print ("LOADING... ");
   delay(5000);
   lcd.clear();

   pinMode(tombol,INPUT_PULLUP);
}

void loop() {
 
  berat = scale.get_units(10) ;
  fix = (berat + 0.3893)/0.0442;
  fix = fix - 9.0;

  if(fix < 0){
  fix = 0;  
  }
  
  //jika telur jelek adc 1023
  //jika telur bagus adc kurang dari 1023
  
  telur1 = analogRead(A0);
  telur2 = analogRead(A1);
  telur3 = analogRead(A2);
  telur4 = analogRead(A3);
  telur5 = analogRead(A6);
  telur6 = analogRead(A7);
 
   lcd.setCursor(0,0);
   lcd.print("W:");
   lcd.print(fix);
   lcd.print(" gr  ");
   
   lcd.setCursor(0,1);
   lcd.print(telur1);
   lcd.print(" ");
   lcd.print(telur2);
   lcd.print(" ");
   lcd.print(telur3);
   lcd.print("    ");

   lcd.setCursor(0,2);
   lcd.print(telur4);
   lcd.print(" ");
   lcd.print(telur5);
   lcd.print(" ");
   lcd.print(telur6);
   lcd.print("    ");

tombolx = digitalRead(tombol);

if(tombolx == 0){
  
if((telur1 < batastelur)&&(telur2 < batastelur)&&(telur3 < batastelur)&&(telur4 < batastelur)&&(telur5 < batastelur)&&(telur6 < batastelur)){
mp3_play(7);  //play music file 0007.mp3
delay(10000);
mp3_stop();
}

if((telur1 > batastelur)||(telur2 > batastelur)||(telur3 > batastelur)||(telur4 > batastelur)||(telur5 > batastelur)||(telur6 > batastelur)){
mp3_play(8);  
delay(5000);

if(telur1 > batastelur){
mp3_play(1);
delay(5000);
}

if(telur2 > batastelur){
mp3_play(2);
delay(5000);
}

if(telur3 > batastelur){
mp3_play(3);
delay(5000);
}

if(telur4 > batastelur){
mp3_play(4);
delay(5000);
}

if(telur5 > batastelur){
mp3_play(5);
delay(5000);
}

if(telur6 > batastelur){
mp3_play(6);
delay(5000);
}

}

}

Serial.print("*");
Serial.print(berat);
Serial.print(",");
Serial.print(telur1);
Serial.print(",");
Serial.print(telur2);
Serial.print(",");
Serial.print(telur3);
Serial.print(",");
Serial.print(telur4);
Serial.print(",");
Serial.print(telur5);
Serial.print(",");
Serial.print(telur6);
Serial.println("#");
                                                                         
  scale.power_down();                  
  delay(200);
  scale.power_up();

}



c. Program Arduino Mega

#include <Wire.h>
#include "HX711.h"
#include <DFPlayer_Mini_Mp3.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

SoftwareSerial mySerial(2, 3); // RX, TX

HX711 scale(4, 5);       

float tera = 0;
int berat;
float fix;
int x;
int telur1;
int telur2;
int telur3;
int telur4;
int telur5;
int telur6;
int tombol = 7;
int tombolx;


void setup() {

  Serial.begin(9600);
  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.begin();
  lcd.clear();
  lcd.noCursor();
 
  scale.set_scale(2280.f);       // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                  // reset the scale to 0

   lcd.setCursor (0,0);
   lcd.print ("LOADING... ");
   delay(5000);
   lcd.clear();

   pinMode(tombol,INPUT_PULLUP);
}

void loop() {
 
  berat = scale.get_units(10) ;
  //fix = (berat - 0.4233)/0.1586;

  //jika telur jelek adc 1023
  //jika telur bagus adc kurang dari 1023
 
  telur1 = analogRead(A0);
  telur2 = analogRead(A1);
  telur3 = analogRead(A2);
  telur4 = analogRead(A3);
  telur5 = analogRead(A4);
  telur6 = analogRead(A5);
 
   lcd.setCursor(0,0);
   lcd.print("W:");
   lcd.print(berat);
   lcd.print(" ");
   lcd.print(telur1);
   lcd.print(" ");
   lcd.print(telur2);
   lcd.print("  ");

   lcd.setCursor(0,1);
   lcd.print(telur3);
   lcd.print(" ");
   lcd.print(telur4);
   lcd.print(" ");
   lcd.print(telur5);
   lcd.print(" ");
   lcd.print(telur6);
   lcd.print(" ");

tombolx = digitalRead(tombol);

if(tombolx == 0){
if((telur1 < 1000)&&(telur2 < 1000)&&(telur3 < 950)&&(telur4 < 950)&&(telur5 < 950)&&(telur6 < 950)){
mp3_play(7);  //play music file 0007.mp3
delay(10000);
mp3_stop();
}

if((telur1 > 1000)&&(telur2 < 950)&&(telur3 < 950)&&(telur4 < 950)&&(telur5 < 950)&&(telur6 < 950)){
mp3_play(8);  
delay(5000);
mp3_play(1);
delay(5000);
mp3_stop();
}

if((telur1 < 1000)&&(telur2 > 950)&&(telur3 < 950)&&(telur4 < 950)&&(telur5 < 950)&&(telur6 < 950)){
mp3_play(8);  
delay(5000);
mp3_play(2);
delay(5000);
mp3_stop();
}

if((telur1 < 1000)&&(telur2 < 950)&&(telur3 > 950)&&(telur4 < 950)&&(telur5 < 950)&&(telur6 < 950)){
mp3_play(8);  
delay(5000);
mp3_play(3);
delay(5000);
mp3_stop();
}

if((telur1 < 1000)&&(telur2 < 950)&&(telur3 < 950)&&(telur4 > 950)&&(telur5 < 950)&&(telur6 < 950)){
mp3_play(8);  
delay(5000);
mp3_play(4);
delay(5000);
mp3_stop();
}

if((telur1 < 1000)&&(telur2 < 950)&&(telur3 < 950)&&(telur4 < 950)&&(telur5 > 950)&&(telur6 < 950)){
mp3_play(8);  
delay(5000);
mp3_play(5);
delay(5000);
mp3_stop();
}

if((telur1 < 1000 )&&(telur2 < 950)&&(telur3 < 950)&&(telur4 < 950)&&(telur5 < 950)&&(telur6 > 950)){
mp3_play(8);  
delay(5000);
mp3_play(6);
delay(5000);
mp3_stop();
}
}

Serial.print("*");
Serial.print(berat);
Serial.print(",");
Serial.print(telur1);
Serial.print(",");
Serial.print(telur2);
Serial.print(",");
Serial.print(telur3);
Serial.print(",");
Serial.print(telur4);
Serial.print(",");
Serial.print(telur5);
Serial.print(",");
Serial.print(telur6);
Serial.println("#");
                                                                         
  scale.power_down();                  
  delay(200);
  scale.power_up();

}
 
 
 
 
d. Program ESP8266
 
#include <SPI.h>
#include <ESP8266WiFi.h>

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int value4;
int value5;
int value6;
int berat;

int telur1;
int telur2;
int telur3;
int telur4;
int telur5;
int telur6;

int datain1;
int datain2;
int datain3;
int datain4;
int datain5;
int datain6;
int datain7;

String dataIn;
String dt[10];
int i;
boolean parsing = false;

String apiKey = "976GJHG9IKHGHGGF";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char *ssid =  "HOTSPOTHPKU";     // replace with your wifi ssid and wpa2 key
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

WiFiClient client;

void setup()
{
 
  dataIn="";
  Serial.begin(9600);
  delay(10);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

      while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");

}

void loop()
{

while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
    parsingData();
       
  if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
                      {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(berat);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + berat + "&field2=" + telur1 + "&field3=" + telur2 + "&field4=" + telur3 + "&field5=" + telur4 + "&field6=" + telur5 + "&field7=" + telur6 + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                                       
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                                          
                             Serial.println(". Send to Thingspeak.");
                        }
                       
          client.stop();

          //Serial.println("Waiting...");

  delay(10000);
 
 }
}

void parsingData(){
int j=0;

//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];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();
 datain3 = dt[2].toInt();
 datain4 = dt[3].toInt();
 datain5 = dt[3].toInt();
 datain6 = dt[3].toInt();
 datain7 = dt[3].toInt();

 berat = datain1 / 1;
 telur1 = datain2 / 1;
 telur2 = datain3 / 1;
 telur3 = datain4 / 1;
 telur4 = datain5 / 1;
 telur5 = datain6 / 1;
 telur6 = datain7 / 1;
 
}
 
 
 
 
d. VIDEO HASILNYA

 

 
 
 

Menampilkan Longitude dan Latitude GPS Neo 6M Ublox ke LCD OLED ARDUINO

Menampilkan Longitude dan Latitude GPS Neo 6M Ublox ke LCD OLED ARDUINO

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa mendeteksi lokasi menggunakan modul GPS Neo Ublok 6M yang ditampilkan ke lcd OLED berupa latitude dan longitudenya. untuk lebih jelasnya berikut adalah komponen dan programnya.


a. Komponen yang dipakai



b. Program Arduino IDE

 //vcc pada GPS modul adalah 3,3 volt
/*********************
 *10 to GPS Module TX*
 *09 to GPS Module RX*
 *********************/

#include <Wire.h>  // i2C Conection Library
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include "Adafruit_GFX.h"
#include "OakOLED.h"

SoftwareSerial mySerial(10, 11);
TinyGPS gps;

OakOLED oled;

int dataadc;
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup()
{
    oled.begin();
    oled.display();
    
   // Oploen serial communications and wait for port to open:
  Serial.begin(9600);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = ");
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop() // run over and over
{

  dataadc = analogRead(A0);
 
  bool newdata = false;
  unsigned long start = millis();
  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (mySerial.available())
    {
      char c = mySerial.read();
      //Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c))
      {
        newdata = true;
        break;  // uncomment to print new data immediately!
      }
    }
  }
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void gpsdump(TinyGPS &gps)
{
 
  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  //oled.clearDisplay();
  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print("LAT: ");
  oled.println(flat, 5);

  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 16);
  oled.print("LONG: ");
  oled.println(flon, 5);

  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 32);
  oled.print("HUM: ");
  oled.println(dataadc);
  oled.display();

}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
  rounding /= 10.0;
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}



c. VIDEO HASILNYA



 

DETEKSI LAMPU PLN ON/OFF LALU HIDUPKAN RELAY ON/OFF

DETEKSI LAMPU PLN ON/OFF LALU HIDUPKAN RELAY ON/OFF

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi tegangan PLN 220v yang mana jika nanti listrik PLN off maka akan menghidupkan relay, lalu dari relay tersebut dapat dihubungkan ke lampu emergency atau genset. untuk lebih jelasnya berikut adalah koding dan komponenya.

 

a. Komponen yang dipakai


 

b. Program Arduino IDE

#include <PZEM004Tv30.h>
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>  
PZEM004Tv30 pzem(2, 3);
LiquidCrystal_I2C lcd(0x27, 16, 2);

int relay1 = 4;
int voltage;

int tegangan;
int arus;
int daya;
int kwh;

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(relay1,OUTPUT);
  digitalWrite(relay1,HIGH); //off
}

void loop() {

  voltage = pzem.voltage();

  lcd.setCursor(0, 0);
  lcd.print("V: ");
  lcd.print(voltage);
  lcd.print("   ");

if(voltage >= 100){
  digitalWrite(relay1,HIGH); //off
}

if(voltage <= 100){
  digitalWrite(relay1,LOW); //on
}


delay(1000);
}

 

 

c. VIDEO HASILNYA