Translate

Membuat Anemometer dengan Arduino

Membuat Anemometer dengan Arduino
 

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur kecepatan angin atau anemometer, alat ini menggunakan arduino dan interface yang dipakai adalah lcd 16x2. di alat ini juga dilengkapi dengan sebuah buzzer agar saat kecepatan angin melebihi batas maka akan membunyikan buzzer tersebut untuk lebih jelasnya berikut adalah komponen dan programnya.
 
 
a. Komponen Penyusun
 



b. Program Arduino IDE

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x27, 16, 2);

// 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
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;
int buzm = 11; //pin buzzer

void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
 
  pinMode(buzm,OUTPUT);
  digitalWrite(buzm,LOW);
 
  pinMode(GPIO_pulse, INPUT_PULLUP);
  digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
 
}


void loop()
{
  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
        
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

  lcd.setCursor(0, 0);
  lcd.print("Kec=");
  lcd.print(velocity_ms);
  lcd.print(" m/s ");

if(velocity_ms > 5){
  lcd.setCursor(0, 1);
  lcd.print("Tinggi  ");
  digitalWrite(buzm,HIGH);
}
if((velocity_ms >= 3)&&(velocity_ms <= 5)){
  lcd.setCursor(0, 1);
  lcd.print("Sedang  ");
  digitalWrite(buzm,LOW);
}
if(velocity_ms < 3){
  lcd.setCursor(0, 1);
  lcd.print("Rendah  ");
  digitalWrite(buzm,LOW);
}  

}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}

 


c. VIDEO HASILNYA


 

Tutorial Modbus RS485 Arduino : Nurse Call

Tutorial Modbus RS485 Arduino : Nurse Call


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat dengan menggunakan modbus RS485 untuk alat Nurse Call, jadi alat ini berfungsi untuk memanggil perawat agar datang keruangan yang dibutuhkan misalnya ruangan pasien yang membutuhkan bantuan maka alat ini dapat digunakan. untuk lebih jelasnya berikut adalah koding dan komponennya.



a. Skema Alat




b. Master Nurse Call




c. Nurse Call Slave






d. Program Arduino IDE Master Nurse Call

#include <ModbusRtu.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define slaveID 11

int tombol1 = 10;
int tombol2 = 11;
int tombol3 = 12;
int tombol1x;
int tombol2x;
int tombol3x;


uint16_t nilainya = 0;
unsigned long lastPrint = 0;

// data array for modbus network sharing
uint16_t au16data[4] = {
  slaveID, 225, 8888, 9999
};

Modbus slave(slaveID, mySerial, 4); // this is slave @1 and RS-232 or USB-FTDI

void setup() {
  Serial.begin(9600);
  mySerial.begin( 19200 ); // baud-rate at 19200
  slave.start();
  delay(10);
  pinMode(tombol1,INPUT_PULLUP);
  pinMode(tombol2,INPUT_PULLUP);
  pinMode(tombol3,INPUT_PULLUP);
}

void loop() {
  slave.poll( au16data, 4 );
  if (millis() - lastPrint > 200) {
    Serial.print(au16data[0]); Serial.print(":");
    Serial.print(au16data[1]); Serial.print(":");
    Serial.print(au16data[2]); Serial.println();
    lastPrint = millis();
  }
  readSensor(); //for ultrasonic sensor
}

void readSensor() {
  tombol1x = digitalRead(tombol1);
  tombol2x = digitalRead(tombol2);
  tombol3x = digitalRead(tombol3);

  if(tombol1x == 0){
    nilainya = 1;
   }

  if(tombol2x == 0){
    nilainya = 2;
   }

  if(tombol3x == 0){
    nilainya = 3;
   }
   
  au16data[1] = nilainya; //data to be sent to slave device
}




e. Program Arduino IDE Slave Nurse Call

// modbus RS485 read and write register
// V1.1 
// 1 master 2 slave, 
// 1 slave : 1 input 1 output

#include <Wire.h>
#include <ModbusRtu.h>
#define slaveNumber 5
#define delayCom 15
#define maxQuery 2*2//slaveNumer*2
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
SoftwareSerial mySerial(2, 3);
LiquidCrystal_I2C lcd(0x27,16,2);

uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query

uint16_t dataBus[slaveNumber*3];
uint16_t lastPrint=100;
int slaveID[slaveNumber] = {11,12,13,14,15}; //id = 0,1,2,3,4
/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  port : Serial1 port
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus master(0,mySerial,4); // ID, seriapNumber, enablePin

/**
 * This is an structe which contains a query to an slave device
 */
modbus_t telegram[slaveNumber*2];

unsigned long u32wait;

void init_modBus(){
  int num=0;
  int addr=0;
////SLAVE 1
  // Read 1 data from Slave 11
  telegram[num].u8id = slaveID[0]; // slave address
  telegram[num].u8fct = 3; // function code (this one is registers read)
  telegram[num].u16RegAdd = 0; // start address in slave
  telegram[num].u16CoilsNo = 2; // number of elements (coils or registers) to read
  telegram[num].au16reg = dataBus; // pointer to a memory array in the Arduino
  num+=1;
  addr+=2;
  
  // Write 1 data to Slave 11
  telegram[num].u8id = slaveID[0]; // slave address
  telegram[num].u8fct = 6; // function code (this one is write a multiple register)
  telegram[num].u16RegAdd = 2; // start address in slave
  telegram[num].u16CoilsNo = 1; // number of elements (coils or registers) to write
  telegram[num].au16reg = dataBus+2; // pointer to a memory array in the Arduino
  num+=1;
  addr+=1;

  master.start();
  master.setTimeOut( 100 ); // if there is no answer in 100 ms, roll over
  u32wait = millis() + 40;
  u8state = u8query = 0; 
  
}

void rtuState(){
  switch( u8state ) {
  case 0: 
    if (millis() >= u32wait) u8state++; // wait state
    break;
  case 1: 
    master.query( telegram[u8query] ); // send query (only once)
    u8state++;
    u8query++;
    if (u8query >= maxQuery) 
      u8query = 0;
    break;
  case 2:
    master.poll(); // check incoming messages if communication in idle state
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + delayCom;  //delay for next state
    }
    break;
  }
}

void printData(){
  if (millis() - lastPrint>200){
    //print data to validate
    Serial.print(dataBus[0]); Serial.print(":");
    Serial.print(dataBus[1]); Serial.print(":");
    Serial.print(dataBus[2]); Serial.print("\t:\t");
    //Serial.print(dataBus[3]); Serial.print(":");
    //Serial.print(dataBus[4]); Serial.print(":");
    //Serial.print(dataBus[5]); 
    Serial.println();
  }
}

void processData(){
  //data to be sent so slave 1 based on slave 2 data
  dataBus[2] = dataBus[4]*0.25; //convert 1023 to 255
  //data to be sent so slave 2 based on slave 1 data
  //dataBus[5] = dataBus[1]*0.25;

   if(dataBus[1] == 0){
     lcd.setCursor(0, 0);
     lcd.print("               ");
    }
    
   if(dataBus[1] == 1){
     Serial.println("RUANG DOKTER");
     lcd.setCursor(0, 0);
     lcd.print("RUANG DOKTER  ");
    }

  if(dataBus[1] == 2){
    Serial.println("RUANG PASIEN");
    lcd.setCursor(0, 0);
    lcd.print("RUANG PASIEN   ");
   }

  if(dataBus[1] == 3){
    Serial.println("RUANG RAWAT");
    lcd.setCursor(0, 0);
    lcd.print("RUANG RAWAT   ");
   }
    
}

void setup() {
  lcd.begin();
  lcd.noCursor();
  lcd.clear();
  Serial.begin (9600); //baud rate of Serial PC
  mySerial.begin( 19200 ); // baud-rate of RS485
  init_modBus();
}

void loop() {
  rtuState();
  printData();
  processData();
}




f. VIDEO HASILNYA





Alat Deteksi Listrik Padam Kirim Notifikasi SMS SIM900A / SIM800L

Alat Deteksi Listrik Padam Kirim Notifikasi SMS SIM900A / SIM800L
 
 
          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan sensor tegangan AC 220 yaitu ZMPT, alat ini berfungsi ketika listrik dirumah padam maka akan mengirimkan notifikasi berupa sms ke nomor HP tujuan. sehingga jika pemilik rumah memiliki hewan peliharaan atau sesuatu yang tidak boleh gelap dirumah maka si pemilik rumah bisa menyuruh orang untuk menghidupkan genset dirumah. untuk lebih jelasnya berikut komponen dan kodingnya.


a. Komponen yang dipakai

 
1. Arduino Uno
2. sensor ZMPT
3. Sim900A / Sim800L
4. Powerbank


b. Program Arduino IDE

#include "Wire.h"
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int vin = 0;
int iin = 0;
int vout;
float kal;

int a = 0;
int zero = 1;
int kondisi = 0;
int dataadc;

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
unsigned long values[100];
int vin1;
int vin2;
int vin3;
int vin4;
unsigned int i1;
unsigned int z1;
unsigned int i2;
unsigned int z2;
unsigned int i3;
unsigned int z3;
unsigned int i4;
unsigned int z4;


void setup() {
  Serial.begin(9600);
 
  Serial.println("GSM Shield testing.");
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          if (sms.SendSMS("08123456789", "Alat Ready"))
          Serial.println("\nSMS sent OK");
     }
     
}


void loop() {
 
z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

for(i1=0;i1<100;i1++) {
  values[i1] = analogRead(A0);            
  if (values[i1] >= z1) {
  z1 = values[i1];
  }
}

for(i2=0;i2<100;i2++) {
  values[i2] = analogRead(A0);            
  if (values[i2] >= z2) {
  z2 = values[i2];
  }
}
 
for(i3=0;i3<100;i3++) {
  values[i3] = analogRead(A0);            
  if (values[i3] >= z3) {
  z3 = values[i3];
  }
}
 
 for(i4=0;i4<100;i4++) {
  values[i4] = analogRead(A0);            
  if (values[i4] >= z4) {
  z4 = values[i4];
  }
}
 
vin1 = z1 ;
vin2 = z2 ;
vin3 = z3 ;
vin4 = z4 ;

z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

if((vin1 > vin2)&&(vin1 > vin3)&&(vin1 > vin4)){
  vout = vin1;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin2 > vin1)&&(vin2 > vin3)&&(vin2 > vin4)){
  vout = vin2;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin3 > vin1)&&(vin3 > vin2)&&(vin3 > vin4)){
  vout = vin3;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin4 > vin1)&&(vin4 > vin2)&&(vin4 > vin3)){
  vout = vin4;
  kal = (vout - 515.9) / 0.413 ;
}

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

Serial.println(kal);

 if((kal > 200)&&(kondisi == 1)){
  if (sms.SendSMS("08123456789", "Listrik Nyala"))
      Serial.println("\nSMS sent OK");
      kondisi = 0;
      delay(3000);
   }
 
 if((kal < 200)&&(kondisi == 0)){
   if (sms.SendSMS("08123456789", "Listrik Padam"))
      Serial.println("\nSMS sent OK");
      kondisi = 1;
      delay(3000);
   }
      
delay(200);
}




c. VIDEO HASILNYA