Monitor Anemometer Lux Tegangan Arus + Suhu Humidity IOT Thingspeak
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor banyak variabel yaitu Lux Tegangan Arus + Suhu Humidity dengan IOT thingspeak. alat ini menggunakan Arduino Uno wifi sehingga mudah digunakan.
1. Program Arduino
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
#include <BH1750FVI.h>
#include "DHT.h"
#define DHTPIN 8
LiquidCrystal_I2C lcd(0x27, 16, 2);
BH1750FVI LightSensor;
uint16_t lux;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// 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;
int t, h;
void setup() {
Serial.begin(9600);
lcd.begin();
lcd.clear();
lcd.noCursor();
dht.begin();
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()
{
h = dht.readHumidity();
t = dht.readTemperature();
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.print(",");
Serial.print(t);
Serial.print(",");
Serial.print(h);
Serial.println("#");
delay(100);
}
void rpm_anemometer()
{
if (long(micros() - last_micros) >= 5000)
{ // time to debounce measures
rpmcount++;
last_micros = micros();
}
}
2. Program ESP8266
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <WiFiClient.h>
int temp;
int x = 5;
int y;
int t, h;
int value1;
int value2;
int value3;
int value4;
int value5;
int value6;
float tegangan;
int lux;
float arus;
float velocity_ms;
int datain1;
int datain2;
int datain3;
int datain4;
int datain5;
int datain6;
String dataIn;
String dt[10];
int i;
boolean parsing = false;
String apiKey = "GFDHJTTTKJHGFVYU"; // 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 + "&field5=" + t + "&field6=" + h + " 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[4].toInt();
datain6 = dt[5].toInt();
tegangan = datain1 / 100.0;
arus = datain2 / 100.0;
lux = datain3 / 1;
velocity_ms = datain4 / 100.0;
t = datain5 / 1;
h = datain6 / 1;
}
