Translate

Monitor Suhu dan Kelembaban (Temperture Humidity) DHT22 Bascom AVR

Monitor Suhu dan Kelembaban (Temperture Humidity) DHT22 Bascom AVR


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu dan kelembaban, alat ini menggunakan sensor dht22. alat ini memiliki fitur setting untuk input setpoint suhu dan kelembabannya, jika nilai suhu lebih dari setpoint maka buzzer akan berbunyi, kemudian jika nilai kelembaban lebih dari setpoint maka buzzer juga akan berbunyi. 



a. Minimum System ATMega16




b. Sensor DHT22




c. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 8000000

'--------------------------
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Cursor Off
Cls

Declare Sub Get_th(t As Word , H As Word)

Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128

Dht_put Alias Porta.0
Dht_get Alias Pina.0
Dht_io_set Alias Ddra.0

Cls
Cursor Off

Dim Crc As Byte                                             'zmienna do przechowywania bajtów parzystosci
Dim Mybyte As Byte                                          'zmienna do obliczania bitu parzystosci


Dim Sensor_data As String * 40                              'tutaj beda zapisywac sie dane z czujnika
Dim Count As Byte
Dim T As Word                                               'zmienna do przechowywania temperatury
Dim H As Word                                               'zmienna do przechowywania wilgotnosci
Dim S16 As String * 16                                      'zmienna do obliczania odebranych bitów
Dim Ti As Byte                                              'zmienna do przechowywania dziesietnej temperatury
Dim Hi As Byte                                              'zmienna do przechowywania dziesietnej wilgotnosci

Enable Interrupts

Dim Cacah As Integer

Dim Nilai As Integer
Dim Nilai2 As Integer
Dim Nilai3 As Integer
Dim Vx As Integer
Dim Mark As Integer
Dim Waktu As Integer

'led
Ddra.7 = 1
Ddra.6 = 1
Ddra.5 = 1

'buzzer
Ddra.4 = 1
Porta.4 = 1

'pushbutton
Ddrd.7 = 0
Ddrd.6 = 0
Ddrd.5 = 0
Ddrd.4 = 0

'Aktif Low Pushbutton
Portd.7 = 1
Portd.6 = 1
Portd.5 = 1
Portd.4 = 1

Pbset Alias Pind.7
Pbdown Alias Pind.6
Pbup Alias Pind.5
Pbok Alias Pind.4

Led1 Alias Porta.7
Led2 Alias Porta.6
Led3 Alias Porta.5

Buzzer Alias Porta.4

Led1 = 0
Led2 = 0
Led3 = 0

Utama:

Do

Led3 = 0

   Dht_io_set = 1
   Dht_put = 1
   Wait 1
   Call Get_th(t , H)

   Upperline
   Lcd "SUHU: " ; T ; " C " ; "/ " ; Nilai ; "     "
   Lowerline
   Lcd "HUMY: " ; H ; " % " ; "/ " ; Nilai2 ; "     "

If Pbset = 0 Then
Buzzer = 0
Waitms 100
Buzzer = 1
Waitms 100
Buzzer = 0
Waitms 100
Buzzer = 1

Cls
Wait 1
Goto Setting1
End If


If Nilai > 0 And T >= Nilai And Nilai2 > 0 And H >= Nilai2 Then
Porta.4 = 0
End If

If Nilai > 0 And T >= Nilai And Nilai2 > 0 And H < Nilai2 Then
Porta.4 = 0
End If

If Nilai > 0 And T < Nilai And Nilai2 > 0 And H >= Nilai2 Then
Porta.4 = 0
End If

If Nilai > 0 And T < Nilai And Nilai2 > 0 And H < Nilai2 Then
Porta.4 = 1
End If

Loop

Setting1:

Do

Upperline
Lcd "SET BATAS"

Lowerline
Lcd "Suhu= " ; Nilai ; " C    "


If Pbup = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Incr Nilai
End If

If Pbdown = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Decr Nilai
End If

If Nilai > 100 Then
Nilai = 0
End If

If Nilai < 0 Then
Nilai = 100
End If

If Pbok = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Cls
Wait 1
Goto Setting2
End If

Loop

Setting2:

Do

Upperline
Lcd "SET BATAS"

Lowerline
Lcd "Humy= " ; Nilai2 ; " %    "


If Pbup = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Incr Nilai2
End If

If Pbdown = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Decr Nilai2
End If

If Nilai2 > 100 Then
Nilai2 = 0
End If

If Nilai2 < 0 Then
Nilai2 = 100
End If


If Pbok = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Cls
Wait 1
Goto Utama
End If

Loop

Sub Get_th(t As Word , H As Word)

 Count = 0
 Sensor_data = ""
 Dht_io_set = 1                                             'robimy wyjscie z PD.6
 Dht_put = 0                                                'ustawic magistrale w stan LOW


 Waitms 1                                                   'odczekac co najmniej 18ms

 Dht_put = 1                                                'zwolnic magistrale
 Waitus 20
 Dht_io_set = 0                                             'robimy wejscie z PD.6
 Waitus 40                                                  'odczekaj 40 ms
 If Dht_get = 1 Then                                        'jesli jest jeszcze jeden, ???? ?? ??? ?? ???????? 1
    H = 1                                                   'oznacza ze czujnik nie odpowiedzial
    Exit Sub                                                'konczymy podprogram
 End If

'jesli czujnik odpowiedzial i wyciagnal magistrale do ziemi kontynuujemy prace
  Waitus 80                                                 'czekamy jeszcze 80ms
  If Dht_get = 0 Then                                       'jesli na linii jest nadal 0
    H = 2                                                   'oznacza czujnik zwariowal
    Exit Sub                                                'konczymy podprogram
  End If

'jesli wszystko pójdzie dobrze i czujnik zareagowal prawidlowo, mozemy kontynuowac

  While Dht_get = 1 : Wend                                  'czekamy, az magistrala pokazuje 1

   Do                                                       'zaczynamy przyjmowac 40-bitowe dane
    While Dht_get = 0 : Wend                                'czekamy na ustawienie magistrali w stan 0
    Waitus 30                                               'po wystapieniu stamu 0 czekac 30 ms
     If Dht_get = 1 Then                                    'jesli na szynie 1
       Sensor_data = Sensor_data + "1"                      'zapisujemy do zmiennej ta ?????????? ? ?????????? ??? ???????
       While Dht_get = 1 : Wend                             'i czekamy az nadajnik wysle kolejny bit
       Else                                                 'w przeciwnym razie, jesli tam jest 0
       Sensor_data = Sensor_data + "0"                      'zapisujem je do zmiennej
    End If
    Incr Count                                              'zwiekszamy licznik
   Loop Until Count = 40                                    'Powtarzaj te czynnosc dopóki licznik osiagnie liczbe 40

   Dht_io_set = 1
   Dht_put = 1

'zaczynamy rozkladac otrzymane dane


   S16 = Left(sensor_data , 16)
   H = Binval(s16)
   H = H / 10
   Hi = H Mod 10

   S16 = Mid(sensor_data , 17 , 16)
   T = Binval(s16)
   T = T / 10
   Ti = T Mod 10

   S16 = Right(sensor_data , 8)
   Crc = Binval(s16)
   'test sumy kontrolnej

   Mybyte = T + H                                           'dodajemy wartosci temperatury i wilgotnosci
   If Mybyte <> Crc Then                                    'jesli suma kontrolna sie nie zgadza


      Lcd "error"                                           'Oznacza to, ze dane nie sa poprawne
   End If

End Sub




d. VIDEO HASILNYA





Monitor Daya Tegangan dan Arus dan Pembatas Arus Maksimal via BLYNK

Monitor Daya Tegangan dan Arus dan Pembatas Arus Maksimal via BLYNK
 
 
          Pada kesempatan ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor tegangan arus dan daya secara realtime dengan menggunakan blynk dan juga alat ini memiliki fitur yang dapat membatasi arus berlebih jadi jika arus yang mengalir telah melebihi maksimal yang seperti kita inputkan melalui keypad maka relay akan off sehingga arus akan off juga. untuk lebih jelasnya berikut adalah komponen dan programnya.
 
 
a. Arduino Uno
 

 
 
b. Sensor Pzem 004t
 

 
 
c. Relay Modul 5v
 

 
 
d. Keypad 4x4
 

 
 
e. LCD 16x2 I2C
 

 
 
f. Wemos d1 mini
 



g. Interface Blynk
 

 
 
h. Program Arduino
 
#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>  
#include <PZEM004Tv30.h>

PZEM004Tv30 pzem(2,3);
LiquidCrystal_I2C lcd(0x27, 16, 2);

int relay = 4;
int led = 9;
int buzzer = 10;
int arus = 0;
float arusx;
float arusflo;

char customKey;
const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {A0,A1,A2,A3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,6,7,8}; //connect to the column pinouts of the keypad {5,6,7,8};

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);


void setup()
{
 
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, HIGH);
 
  lcd.begin();
  lcd.noCursor();
  lcd.clear();
  Serial.begin(9600);   

}

void loop()
{
 
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
   
    lcd.setCursor(0,0);
    lcd.print("I= ");
    lcd.print(current,2);
    lcd.print(" / ");
    lcd.print(voltage,1);
    lcd.print("     ");
    lcd.setCursor(0,1);
    lcd.print("S= ");
    lcd.print(arusx,2);
    lcd.print("   ");

    Serial.print("*");
    Serial.print(voltage * 100);
    Serial.print(",");
    Serial.print(current * 100);
    Serial.print(",");
    Serial.print(power * 100);
    Serial.print(",");
    Serial.print(arusx * 100);
    Serial.println("#");  

    customKey = customKeypad.getKey();
    
    if(customKey == 'A'){
    lcd.clear();
    delay(1000);  
    arus = 0;
    arusx = 0;
    setting();
    }

    if((current > arusx)&&(arusx > 0)){
      digitalWrite(relay,HIGH);
      digitalWrite(buzzer,LOW);
      digitalWrite(led,HIGH);
      delay(2500);
      digitalWrite(relay,LOW);
      digitalWrite(buzzer,HIGH);
      digitalWrite(led,LOW);
      }

    if((current < arusx)&&(arusx > 0)){
      digitalWrite(relay,LOW);
      digitalWrite(buzzer,HIGH);
      digitalWrite(led,LOW);
      }  

   delay(200);
}

void setting(){

  lcd.setCursor(0,0);
  lcd.print("Set Max Arus");
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
  {
      arus = arus * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(arus);
  }

    if(customKey == 'A')
  {
   arusx = 0;
   arus = 0;
   lcd.clear();
   delay(1000);
  }

  if(customKey == 'B')
  {
   arusx = arus / 1.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'C')
  {
   arusx = arus / 10.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'D')
  {
   arusx = arus / 100.0;
   lcd.clear();
   delay(1000);
   return;
  }

setting();
}

 

i. Program Wemos D1 mini
 
#define BLYNK_PRINT Serial   
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>

int temp;
int x = 5;
int y;

int value1;
int value2;

float tegangan = 0;
float arus = 0;
float powerx = 0;
float spx = 0;

float datain1;
float datain2;
float datain3;
float datain4;

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

char auth[] = "2_SeDKdvjeAWod1cUIKAKXL2G_Ld8Pen";
char ssid[] = "myhotspotku";
char pass[] = "123456789";

SimpleTimer timer;

// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means

// that you define how often to send data to Blynk App.
void sendSensor()
{

 Blynk.virtualWrite(V5, tegangan);
 Blynk.virtualWrite(V6, arus);
 Blynk.virtualWrite(V7, powerx);
 Blynk.virtualWrite(V8, spx);
 delay(1000);

}

void setup()
{
 
  dataIn="";
  // Debug console
  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);

  // Setup a function to be called every second
  timer.setInterval(1000L, sendSensor);
}

void loop()
{

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

if(parsing){
  parsingData();
   
  Blynk.run();
  timer.run();
}

}

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();

//kirim data hasil parsing
Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);
Serial.print("\n");
Serial.print("data 4 : ");
Serial.print(datain4);
Serial.print("\n");

//Serial.print("data 3 : ");
//Serial.print(dt[2].toInt());
//Serial.print("\n\n");

 tegangan = datain1 / 100.0;
 arus = datain2 / 100.0;
 powerx = datain3 / 100.0;
 spx = datain4 / 100.0;

}
 

 
j. VIDEO HASILNYA
 


 
 

Monitor Flow Rate Udara dan Tekanan Udara MPX5100DP

Monitor Flow Rate Udara dan Tekanan Udara MPX5100DP 


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor flow rate udara dan tekanan udara, alat ini menggunakan sensor flow dan MPX5100DP dan juga dibekali powerbank untuk powernya. untuk lebih jelasnya berikut adalah komponen dan programnya.


a. Arduino Uno




b. Sensor Flow




c. Sensor Tekanan MPX5100DP





d. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //library lcd
LiquidCrystal_I2C lcd(0x27, 16,2); //address lcd i2c 

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

float calibrationFactor = 4.5;

volatile byte pulseCount;

unsigned int frac;
float flowRate;
unsigned int flowMilliLitres;
float totalMilliLitres;

unsigned long oldTime;
float pressure_pascal;
float pressure_bar;
int presure;
int dataadc;
int x;
float v;
float kpa;
float vol;
float bar;

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

  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

}

void loop(){

if((millis() - oldTime) > 1000) 
  {

    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    frac = (flowRate - int(flowRate)) * 10;
    pulseCount = 0;
   
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }

  /*
  x = analogRead(A0);
  v = x*(5.0/1023.0);

  pressure_pascal = (3.0*(v-0.47))*1000000.0;
  pressure_bar = pressure_pascal/10e5;
  presure = pressure_bar;
  */
   
  dataadc = analogRead(A0);
  vol = dataadc * (5.0 / 1023.0);
  kpa = (( vol - 0.2) / 0.045 )* 0.1971621298;
  bar = kpa/100.0;
  
  if(bar < 0){
  bar = 0;  
  }
   
  lcd.setCursor(0, 0);
  lcd.print("Bar= ");
  lcd.print(bar);
  lcd.print("   ");
      
  lcd.setCursor(0, 1);
  lcd.print("L/min= ");
  lcd.print(flowRate);
  lcd.print("   ");
 
  delay(200);  
}

void pulseCounter()
{
  pulseCount++;
}



e. VIDEO HASILNYA






Tutorial Membuat Power Supply 12v dan 5v Software Cadsoft Eagle 6.3.0

Tutorial Membuat Power Supply 12v dan 5v Software Cadsoft Eagle 6.3.0


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah skematik dan skema pcb power supply 12v dan 5v pada software eagle, pada tutorial ini diperuntukkan untuk pemula sehingga pada tutorial video akan disengaja banyak jumper dan jarak antar komponen yang agak renggang. untuk lebih jelasnya berikut skema dan tutorialnya. 



a.  Skema Power Supply



b. VIDEO HASILNYA





Monitoring Suhu Temperature Sensor MLX90614 dan LM35

Monitoring Suhu Temperature Sensor MLX90614 dan LM35 


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitoring suhu dengan menggunakan 2 buah sensor yang berbeda didalam 1 arduino dengan interface yang digunakan yaitu LCD. untuk lebih jelasnya berikut adalah skema dan programnya.



a. Skema alat


b. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //library lcd 
LiquidCrystal_I2C lcd(0x27, 16, 2); //setting address lcd
#include <Adafruit_MLX90614.h> //setting library sensor
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); //setting sensor parameter

float TargetC; //inisialisasi variabel
int sensorValue; //inisialisasi variabel
float suhulm35; //inisialisasi variabel

void setup() {
  mlx.begin();
  Serial.begin(9600); //untuk serial
  lcd.begin(); //setting lcd
  lcd.clear(); //clear screen
  lcd.noCursor(); //tidak ada kursor
}

void loop() {

sensorValue = analogRead(A0); //mengambil data adc di pin A0
suhulm35 = (sensorValue * (5.0 / 1023.0))* 100.0; //lalu ubah ke tegangan dan suhu
  
TargetC = mlx.readObjectTempC(); //ambil data sensor mlx

lcd.setCursor(0,0); //untuk menampilkan pada baris atas
lcd.print("Suhu= "); //menampilkan tulisan
lcd.print(TargetC); //menampilkan data
lcd.print(" C    "); //menampilkan tulisan
lcd.setCursor(0,1); //untuk menampilkan pada baris bawah
lcd.print("lm35= "); //untuk menamplkan tulisan
lcd.print(suhulm35); //untuk menampilkan data
lcd.print(" C    "); //untuk menampilkan tulisan

delay(1000); //delay 5000ms
}




c. VIDEO HASILNYA