Translate

Monitor Kualitas Telur Bagus atau Jelek Arduino

Monitor Kualitas Telur Bagus atau Jelek Arduino


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat melakukan sortir telur dan pengecekan secara beruntun. alat ini menggunakan sensor RGB dan 3 buah servo sebagai aktuatornya. untuk suara menggunakan DF Player mini. untuk lebih jelasnya berikut adalah koding dan skemanya.


1. Skema alat



2. Program Arduino IDE

#include <Wire.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <DFPlayer_Mini_Mp3.h>
#include "HX711.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial mySerial(2, 3); // RX, TX
Servo myservo1;
Servo myservo2;
Servo myservo3;
//int ledhijau = 4;
//int ledmerah = 5;
//myservo1.write(100); stay
//myservo1.write(50); dorong

//myservo2.write(100); lurus
//myservo2.write(50); kanan
//myservo2.write(150); kiri

HX711 scale(8, 7);       

long duration, distance;
float tera = 0;
int berat;
float fix;
int x;
int dataadc;
int nilai;
int tombol = 12;
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
  pinMode(tombol,INPUT_PULLUP);  
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  myservo1.attach(9); //pelontar
  myservo2.attach(5); //kanan
  myservo3.attach(6); //kiri 
  myservo1.write(100);
  myservo2.write(100);
  myservo3.write(100);
  //pinMode(ledhijau,OUTPUT);
  //pinMode(ledmerah,OUTPUT);

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

void loop() {

tombolx = digitalRead(tombol);
  
 dataadc = analogRead(A0);
 
 berat = scale.get_units(10) * 1;
 //fix = (berat - 0.4233)/0.1586;

 if(berat < 0){
  berat = berat * -1;
 }
 
 lcd.setCursor(0,0);
 lcd.print("Berat= ");
 lcd.print(berat);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("ADC= ");
 lcd.print(dataadc);
 lcd.print("   ");
      
 scale.power_down();                  
 delay(200);
 scale.power_up();

if(tombolx == 0){
    myservo1.write(50);

//telur bagus
if((berat > 20)&&(dataadc > 800)){
 lcd.clear(); 
 lcd.setCursor(0,0);
 lcd.print("TELUR BAGUS  ");
 //digitalWrite(ledmerah,LOW);
 //digitalWrite(ledhijau,HIGH); 
 myservo2.write(100);
 myservo3.write(100); 
 Serial.print(nilai);
 delay(3000);
 lcd.clear();
 myservo1.write(100);
 mp3_play(1);  //play music file 0001.mp3
 delay(10000);
 mp3_stop();
 }

//telur jelek
if((berat < 20)&&(dataadc < 800)){
 lcd.clear(); 
 lcd.setCursor(0,0);
 lcd.print("TELUR JELEK  ");
 //digitalWrite(ledmerah,HIGH);
 //digitalWrite(ledhijau,LOW);
 myservo2.write(150);
 myservo3.write(150);
 Serial.print(nilai);
 delay(3000);
 lcd.clear();
 myservo1.write(100);
 mp3_play(2);  //play music file 0002.mp3
 delay(10000);
 mp3_stop();
 }

}

}


3. VIDEO HASILNYA


Komunikasi RS485 Arduino 2 Master 1 Slave Nurse Call Interface Visual Basic 6.0

Komunikasi RS485 Arduino 2 Master 1 Slave Nurse Call Interface Visual Basic 6.0


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat nurse call dengan komunikasi 2 master dan 1 slave dengan menggunakan RS485 Arduino. alat ini menggunakan interface VB 6.0 dengan tampilan berupa ruang 1 dan 2 yang mana terdapat 2 perintah yaitu warna merah dan biru. untuk lebih jelasnya berikut adalah koding dan skemanya.


1. Skema Master 1 dan 2



2. Skema Slave



3. Program Arduino Master 1

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

#define slaveID 11

int tombol1 = 10;
int tombol2 = 11;
int tombol1x;
int tombol2x;

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

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

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

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

  au16data[1] = nilainya; //data to be sent to slave device
}



4. Program Aduino Master 2

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

#define slaveID 12

int tombol1 = 10;
int tombol2 = 11;
int tombol1x;
int tombol2x;

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

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

  if((tombol1x == 1)&&(tombol2x == 1)){
    nilainya = 3;
   }
   
  if(tombol1x == 0){
    nilainya = 4;
   }

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


5. Program Arduino Slave

// 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>
SoftwareSerial mySerial(10, 11);

int ruang1;
int ruang2;

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;

  ////SLAVE 2
  // Read 1 data from Slave 12
  telegram[num].u8id = slaveID[1]; // 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 12
  telegram[num].u8id = slaveID[1]; // 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.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[0] == 11)&&(dataBus[1] == 0)){
     ruang1 = 0;
     Serial.println(ruang1);
    }
    
   if((dataBus[0] == 11)&&(dataBus[1] == 1)){
     ruang1 = 1;
     Serial.println(ruang1);
    }
    
   if((dataBus[0] == 11)&&(dataBus[1] == 2)){
     ruang1 = 2;
     Serial.println(ruang1);
    }

   if((dataBus[0] == 12)&&(dataBus[1] == 3)){
     ruang2 = 3;
     Serial.println(ruang2);
    }

    if((dataBus[0] == 12)&&(dataBus[1] == 4)){
     ruang2 = 4;
     Serial.println(ruang2);
    }
    
   if((dataBus[0] == 12)&&(dataBus[1] == 5)){
     ruang2 = 5;
     Serial.println(ruang2);
    } 

}

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

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


6. Program Interface VB 6.0


Option Explicit
Dim arrdata()
Dim TotalBaca As Integer
Dim BMI As Single
Dim Keterangan As String
Const MAKSBACA = 10
Dim sHari As String
Dim aHari

Private Sub berhenti_Click()
  start.Enabled = True
    berhenti.Enabled = False
    TimerBaca.Enabled = False
End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Command3_Click()
Text1.Text = " "
Label1.Caption = " "

End Sub

Private Sub Form_Load()
Dim i As Byte
For i = 1 To 16
    ComboCOM.AddItem (i)
Next i

 aHari = Array("Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu")

End Sub

Private Sub start_Click()
Dim u As Integer

    On Error GoTo ada_eror
    
    MSComm2.CommPort = ComboCOM.Text
    MSComm2.Settings = "9600,N,8,1"
    MSComm2.RThreshold = 15
    MSComm2.InputLen = 15
    MSComm2.InputMode = comInputModeText
    MSComm2.PortOpen = True ' buka port
    
    ReDim arrdata(1 To MAKSBACA + 1)
    For u = 1 To MAKSBACA
        arrdata(u) = 0
    Next
    TotalBaca = 0
    start.Enabled = False
    berhenti.Enabled = True
    TimerBaca.Enabled = True
ada_eror:
 If ComboCOM.ListIndex < 1 Then
    MsgBox "COM berada di Nomor : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "ERROR"
    start.Enabled = True
    berhenti.Enabled = True
    ComboCOM.Text = "Pilih COM"
End If
End Sub

Private Sub Timer1_Timer()
 sHari = aHari(Abs(Weekday(Date) - 1))
 lbltanggal.Caption = "" & sHari & "," & Format(Date, "dd mmmm yyyy")
 lbljam.Caption = Format(Time, "hh:mm:ss")
End Sub

Private Sub TimerBaca_Timer()
Dim strInput As String
Dim strPotong As String
Dim singleInput As Single
Dim u As Integer
    strInput = MSComm2.Input
        strPotong = strInput
        Text1.Text = Text1.Text + strPotong + vbCrLf
        singleInput = Val(strPotong)
        Label5.Caption = singleInput
        If TotalBaca >= MAKSBACA Then
            TimerBaca.Enabled = False
            If MSComm2.PortOpen = True Then MSComm2.PortOpen = False
            Call berhenti_Click
        End If
        
        If Label5.Caption = "0" Then
         Shape1.Visible = False
         Shape2.Visible = False
        End If
        
        If Label5.Caption = "11111" Then
         Shape1.Visible = True
         Shape2.Visible = False
        End If
        
        If Label5.Caption = "22222" Then
         Shape1.Visible = False
         Shape2.Visible = True
        End If
        
        If Label5.Caption = "33333" Then
         Shape3.Visible = True
         Shape4.Visible = True
        End If
        
        If Label5.Caption = "44444" Then
         Shape3.Visible = True
         Shape4.Visible = False
        End If
        
        If Label5.Caption = "55555" Then
         Shape3.Visible = False
         Shape4.Visible = True
        End If
        
End Sub


7. VIDEO HASILNYA