Translate

Monitor Anemometer Lux Tegangan Arus

Monitor Anemometer Lux Tegangan Arus

        
        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor kecepatan angin, lux cahaya, suhu dan kelembaban serta di monitor via Thingspeak dan ditampilkan juga ke lcd, untuk lebih jelasnya berikut adalah kodingnya.


1. Koding Arduino UNO

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

// 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 adcteg;
float tegangan;
int adcarus;
float v;
float arus;


void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();

  LightSensor.begin();
  LightSensor.SetAddress(Device_Address_H);//Address 0x5C
  LightSensor.SetMode(Continuous_H_resolution_Mode);
  
  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()
{

  adcteg = analogRead(A0);
  tegangan = adcteg * (5.0 / 1023.0) * 4.8;

  adcarus = analogRead(A1);
  v = adcarus * (4.8 / 1023.0);
  arus = (v - 2.4)/0.1;


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

  lux = LightSensor.GetLightIntensity();
  
  lcd.setCursor(0,0);
  lcd.print("m/s=");
  lcd.print(velocity_ms);
  lcd.print(" L:");
  lcd.print(lux);
  lcd.print("   ");

  lcd.setCursor(0,1);
  lcd.print("VI=");
  lcd.print(tegangan,1);
  lcd.print("/");
  lcd.print(arus,1);
  lcd.print("   ");

  Serial.print("*");
  Serial.print(tegangan * 100.0);
  Serial.print(",");
  Serial.print(arus * 100.0);
  Serial.print(",");
  Serial.print(lux);
  Serial.print(",");
  Serial.print(velocity_ms * 100.0);
  Serial.println("#");
    
delay(100);
}

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



2. Koding ESP8266

#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <WiFiClient.h>

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int value4;

float tegangan;
int lux;
float arus;
float velocity_ms;

int datain1;
int datain2;
int datain3;
int datain4;

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

String apiKey = "C89ZC3YLACG92XXX";     //  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 =  "1234567890";
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(tegangan);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + tegangan + "&field2=" + arus + "&field3=" + lux + "&field4=" + velocity_ms + " 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();

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

 tegangan = datain1 / 100.0;
 arus = datain2 / 100.0;
 lux = datain3 / 1;
 velocity_ms = datain4 / 100.0;
 
}






Monitor Tinggi dan Berat Badan Interface Python IDE

Monitor Tinggi dan Berat Badan Interface Python IDE
    

       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang berfungsi untuk monitor berat dan tinggi badan secara real time dan menggunakan interface Python. jadi arduino mengirimkan data ke interface Python kemudian ditampilkan ke interface, untuk lebih jelasnya berikut adalah kodingnya. 


1. Koding Arduino

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

// HX711.DOUT    - pin #9
// HX711.PD_SCK    - pin #8

#define trigPin 7
#define echoPin 6

int counter = 0;      //Variabel penghitung nilai
int aState;           //Variabel kondisi
int aLastState;       //Variabel kondisi terakhir

HX711 scale(9, 8);       

long duration, distance;
float tera = 0;
int berat;
float fix;
int x;
int jarak;
int sp = 30;
int tinggi;

void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
 
  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() {
  
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  jarak = 200 - distance;
 
  berat = scale.get_units(10) * -1;
  fix = (berat - 2.1036)/8.978;

if(fix < 0){
  fix = 0;
  }
  
   lcd.setCursor (0,0);
   lcd.print ("W/H= ");
   lcd.print (fix);
   lcd.print (" /  ");
   lcd.print (jarak);
   lcd.print ("  ");   

   Serial.print(berat);
   Serial.print(",");
   Serial.println(jarak);
   
  scale.power_down();                  
  delay(100);
  scale.power_up();

  if (Serial.available() > 0) {
  String teststr = Serial.readString();
  lcd.setCursor(0,1);
  lcd.print(teststr);
  }
}



2. Koding Python

import serial.tools.list_ports
      
ports = list(serial.tools.list_ports.comports())
for p in ports:
    print(p)
# exit()
ser = serial.Serial('COM7',9600)
data = ''
old_data = ''
while True:
    if ser.in_waiting > 0:
        try:
            data = ser.readline().decode('ascii').strip()
            if data != old_data:
                print(f'Data Dari Arduino: {data}')
                old_data = data
        except:
            pass



3. VIDEO ALATNYA





 

Komunikasi Lora SX1278 (2 Transmitter & 1 Receiver) Monitoring Jarak Sensor VL53L1X TOF400C

Komunikasi Lora SX1278 (2 Transmitter & 1 Receiver) Monitoring Jarak Sensor VL53L1X TOF400C


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur jarak max 4 meter dengan menggunakan sensor VL53L1X TOF400C dan komunikasi menggunakan Lora SX1278. alat ini terdapat 2 buah transmitter dan 1 buah receiver sehingga ada 3 device yang digunakan.  


1. Program Arduino Transmitter 1

#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#include <SPI.h>
#include <LoRa.h>
#include <VL53L1X.h>

VL53L1X sensor;

/*
  Module SX1278 // Arduino UNO/NANO    
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   D12
    MOSI        ->   D11     
    SLCK        ->   D13
    Nss         ->   D10
    Di00        ->   D2
    RST         ->   D9      
 */
 
OakOLED oled;

int jarak;
char transmitterID = 'A'; 

void sensor_init(VL53L1X::DistanceMode range_mode, bool high_speed) {
  Wire.begin();
  sensor.setTimeout(500);
  sensor.init();
  sensor.setDistanceMode(range_mode);  
  int budget = high_speed ? 33000 : 140000;
  sensor.setMeasurementTimingBudget(budget);
}

void setup() {
   Serial.begin(115200);
   oled.begin();
   oled.display();    

   while (!Serial);  
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) { // or 915E6, the MHz speed of yout module
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  while (!Serial) {}
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1);
  }

  // Use long distance mode and allow up to 50000 us (50 ms) for a measurement.
  // You can change these settings to adjust the performance of the sensor, but
  // the minimum timing budget is 20 ms for short distance mode and 33 ms for
  // medium and long distance modes. See the VL53L1X datasheet for more
  // information on range and timing limits.
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);

  // Start continuous readings at a rate of one measurement every 50 ms (the
  // inter-measurement period). This period should be at least as long as the
  // timing budget.
  sensor.startContinuous(50);

void loop() {
  
  jarak = sensor.read()/10;
  //Serial.println(jarak);
  
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print(jarak); 
  oled.display(); 
     
  LoRa.beginPacket();
  LoRa.print(transmitterID); // Send ID
  LoRa.print(",");
  LoRa.print(jarak);   // Send Data
  LoRa.endPacket();
  delay(50);
   
}


2. Program Arduino Transmitter 2

#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#include <SPI.h>
#include <LoRa.h>
#include <VL53L1X.h>

VL53L1X sensor;

/*
  Module SX1278 // Arduino UNO/NANO    
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   D12
    MOSI        ->   D11     
    SLCK        ->   D13
    Nss         ->   D10
    Di00        ->   D2
    RST         ->   D9      
 */
 
OakOLED oled;

int jarak;
char transmitterID = 'B'; 

void sensor_init(VL53L1X::DistanceMode range_mode, bool high_speed) {
  Wire.begin();
  sensor.setTimeout(500);
  sensor.init();
  sensor.setDistanceMode(range_mode);  
  int budget = high_speed ? 33000 : 140000;
  sensor.setMeasurementTimingBudget(budget);
}

void setup() {
   Serial.begin(115200);
   oled.begin();
   oled.display();    

   while (!Serial);  
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) { // or 915E6, the MHz speed of yout module
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  while (!Serial) {}
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1);
  }

  // Use long distance mode and allow up to 50000 us (50 ms) for a measurement.
  // You can change these settings to adjust the performance of the sensor, but
  // the minimum timing budget is 20 ms for short distance mode and 33 ms for
  // medium and long distance modes. See the VL53L1X datasheet for more
  // information on range and timing limits.
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);

  // Start continuous readings at a rate of one measurement every 50 ms (the
  // inter-measurement period). This period should be at least as long as the
  // timing budget.
  sensor.startContinuous(50);

void loop() {
  
  jarak = sensor.read()/10;
  //Serial.println(jarak);
  
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print(jarak); 
  oled.display(); 
     
  LoRa.beginPacket();
  LoRa.print(transmitterID); // Send ID
  LoRa.print(",");
  LoRa.print(jarak);   // Send Data
  LoRa.endPacket();
  delay(50);
   
}


3. Program Arduino Receiver

#include <SPI.h>
#include <LoRa.h>   //Download here: http://electronoobs.com/eng_arduino_LoRa_SX1278.php.php
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"

OakOLED oled;

String inString = "";    // string to hold input
int jarak1 = 0;
int jarak2 = 0;

String receivedData = "";
long lastChannelSwitchTime = 0;
long channelSwitchInterval = 3000; // Switch channels every 3 seconds

void setup() {
  Serial.begin(115200);
  oled.begin();
  oled.display(); 
   
  while (!Serial);
  Serial.println("LoRa Receiver");
  if (!LoRa.begin(433E6)) { // or 915E6
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  
int packetSize = LoRa.parsePacket();
  if (packetSize) {
    String received = "";
    while (LoRa.available()) {
      received += (char)LoRa.read();
    }
    
    // Parse format: "ID,Value"
    int commaIndex = received.indexOf(',');
    if (commaIndex != -1) {
      String id = received.substring(0, commaIndex);
      String value = received.substring(commaIndex + 1);

      if(id == "A"){
        jarak1 = value.toInt();;
      }

      if(id == "B"){
        jarak2 = value.toInt();;
      }
         
      //Serial.print("From: ");
      //Serial.print(id);
      //Serial.print(" Value: ");
      //Serial.println(value);
    }
  }

  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(2);
  oled.setCursor(0, 0);
  oled.print("S1: ");
  oled.println(jarak1);

  oled.setTextSize(2);
  oled.setTextColor(2);
  oled.setCursor(0, 20);
  oled.print("S2: ");
  oled.println(jarak2);
  oled.display();        

}


4. VIDEO HASILNYA





Monitoring Jarak Max 10 Meter Sensor Gy-TOF10M via Wireless Lora SX1278 433Mhz

Monitoring Jarak Max 10 Meter Sensor Gy-TOF10M via Wireless Lora SX1278 433Mhz
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur jarak max 10 meter dengan wireless Lora SX1278. alat ini terdiri dari 2 device yaitu transmitter dan receiver, data yang dikirim hanya data jarak saja kemudian ditampilkan ke LCD Oled mini untuk interfacenya. untuk lebih jelasnya berikut adalah koding dan komponennya.
 
 
1. Komponen
 

 
2. Program Arduino IDE Transmitter
 
#include <SoftwareSerial.h>
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#include <SPI.h>
#include <LoRa.h>

/*
  Module SX1278 // Arduino UNO/NANO    
    GND         ->   GND
    Vcc         ->   3.3V
    MISO        ->   D12
    MOSI        ->   D11     
    SLCK        ->   D13
    Nss         ->   D10
    Di00        ->   D2
    RST         ->   D9      
 */
 
OakOLED oled;

typedef struct
{
    float distance;
    uint16_t amp;
    int8_t temp;
} gytof;
SoftwareSerial mySerial(3, 4);  // pin sensor gy-tof10m RX, TX
byte add=0xa4;
byte len=0,start_reg=0;
unsigned char Re_buf[30],counter=0;
unsigned char sign=0;
gytof my_tof;

int jarak;

void setup() {
   Serial.begin(115200);
   mySerial.begin(9600);
   mySerial.listen();  
   oled.begin();
   oled.display();    

   while (!Serial);  
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) { // or 915E6, the MHz speed of yout module
    Serial.println("Starting LoRa failed!");
    while (1);
  }


void loop() {
  unsigned char i=0,sum=0;
  while (mySerial.available()) {  
  
    Re_buf[counter]=(unsigned char)mySerial.read();
    switch(counter)
    {
      case 0:
      if(Re_buf[0]!=add)
      return;
      break;
      case 1:
    
      if(Re_buf[1]!=0x03)
        { 
          counter=0;
          return;
      }
      break;
      case 2:
        if(Re_buf[2]<16)
         start_reg=Re_buf[2];
         else
            { 
          counter=0;
          return;
         }
      break;
      case 3:
         if((start_reg+Re_buf[3])<16)
            len=Re_buf[3];
            else
            { 
              counter=0;
             return;
         }
            
      break;
      default:
         if(len+5==counter)
         {  
            sign=1;
         }
      break;
    }
    
  if(sign)
  {   
     sign=0;
     for(i=0;i<counter-1;i++)
      sum+=Re_buf[i]; 
       counter=0;
     if(sum==Re_buf[i] )        //检查帧头,帧尾
     {           
        if(start_reg==0x08)
        {
         my_tof.distance=(Re_buf[4]<<8)|Re_buf[5];
   my_tof.amp=(Re_buf[6]<<8)|Re_buf[7];
   my_tof.temp=Re_buf[8];
  
        }
        /*
         Serial.print("distance:");
         Serial.print((float)my_tof.distance/10);
         Serial.print("cm,amp:");
         Serial.print(my_tof.amp);
         Serial.print(",temp:");
         Serial.println(my_tof.temp);
        */                
     }
//     else
//        {
//          Serial.print(" sum ");
//          Serial.println(sum);
//      } 
   }
   else
   counter++; 
//   Serial.print("cont:");
//   Serial.println(counter);
  }

  jarak = my_tof.distance/10;

  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print(jarak); 
  oled.display(); 
     
  LoRa.beginPacket();  
  LoRa.print(jarak);
  LoRa.endPacket();
  delay(50);
   
}
 
 
3. Program Arduino IDE Receiver
 
#include <SPI.h>
#include <LoRa.h>   //Download here: http://electronoobs.com/eng_arduino_LoRa_SX1278.php.php
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"

OakOLED oled;

String inString = "";    // string to hold input
int jarak = 0;

void setup() {
  Serial.begin(115200);
  oled.begin();
  oled.display(); 
   
  while (!Serial);
  Serial.println("LoRa Receiver");
  if (!LoRa.begin(433E6)) { // or 915E6
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) { 
    // read packet    
    while (LoRa.available())
    {
      int inChar = LoRa.read();
      inString += (char)inChar;
      jarak = inString.toInt();       
    }
    inString = "";     
    LoRa.packetRssi();    
  }
      
  //Serial.println(jarak); 
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print(jarak); 
  oled.display();  

}
 
 
4. VIDEO HASILNYA