Source Code Arduino

 avatar
unknown
c_cpp
a year ago
7.3 kB
9
Indexable
#include <SoftwareSerial.h>
#include <WiFiEsp.h>
#ifndef HAVE_HWSERIAL1
#endif
#include <Wire.h>
#include <DHT22.h>
#include <BH1750.h>
#define pinDATA SDA
#define kipas 9
#define mistMaker1 10
#define mistMaker2 11

//mencari nilai PPM Seunsor MQ-135
#define RL 1      //nilai RL =10 pada sensor
#define m -0.417  //hasil perhitungan gradien
#define b 0.858   //hasil perhitungan perpotongan
#define Ro 16.47   //hasil pengukuran RO
#define MQ_sensor A0

//variable untuk mencari nilai PPM Gas Ammonia
const int numReadings = 5;  //nilai penambilan sample pembacaan sebesar 5 kali
float readings[numReadings];
int readIndex = 0;
float total = 0;
float average = 0;
//end  PPM AMmmonia

DHT22 dht22(8);
BH1750 lightMeter;
WiFiEspClient client;

//variable untuk metode fuzzy tsukamoto
float keanggotaanKelembaban[3];
float alpha[3];
float z[3];
float Eaizi;
float Eai;
//end fuzzy tsukamoto

char* SSID = "Ciaomi";
char* PASS = "12345678";

SoftwareSerial wifiSerial(2, 3);  // RX, TX

void setWifi(char* ssid, char* pass) {
  wifiSerial.begin(9600);
  WiFi.init(&wifiSerial);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("[WIFI]: Connecting to WiFi...");
    if (WiFi.begin(ssid, pass) == WL_CONNECTED) {
      Serial.println("[WIFI]: Connected");
    } else {
      Serial.println("[WIFI]: Connection failed");
      delay(1000);
    }
  }
}


void fc_keanggotaanKelembaban(float x) {
  // kelembaban kering
  if (x <= 50) {
    keanggotaanKelembaban[0] = 1;
  } else if (x >= 50 && x <= 74) {
    keanggotaanKelembaban[0] = (74 - x) / 24;
  } else {
    keanggotaanKelembaban[0] = 0;
  }

  // Normal / Lembab
  if (x <= 50 || x >= 100) {
    keanggotaanKelembaban[1] = 0;
  } else if (x >= 50 && x <= 75) {
    keanggotaanKelembaban[1] = (x - 50) / 25;
  } else {
    keanggotaanKelembaban[1] = (100 - x) / 25.0;
  }

  // Basah
  if (x >= 95) {
    keanggotaanKelembaban[2] = 1;
  } else if (x >= 87 && x <= 95) {
    keanggotaanKelembaban[2] = (x - 87) / 8;
  } else {
    keanggotaanKelembaban[2] = 0;
  }
}

float getAlphaKering(float alpha) {
  return (keanggotaanKelembaban[0]);
}

float getAlphaLembab(float alpha) {
  return (keanggotaanKelembaban[1]);
}

float getAlphaBasah(float alpha) {
  return (keanggotaanKelembaban[2]);
}

void inferensi(float y) {
  // Reset nilai z di awal inferensi
  for (int i = 0; i < 3; i++) {
    z[i] = 0;
  }

  // Rules 1 = IF kelembaban Kering, THEN mist Maker Hidup
  alpha[0] = getAlphaKering(y);
  if (alpha[0] <= 0.4) {
    z[0] = 0;
  } else if (alpha[0] > 0.4 && alpha[0] <= 0.5) {
    z[0] = (alpha[0] - 0.4) / 0.1;
  } else {
    z[0] = 1;
  }

  // Rules 2 = IF kelembaban Lembab, THEN mist Maker Hidup
  alpha[1] = getAlphaLembab(y);
  if (alpha[1] <= 0.4) {
    z[1] = 0;
  } else if (alpha[1] > 0.4 && alpha[1] <= 0.5) {
    z[1] = (alpha[1] - 0.4) / 0.1;
  } else {
    z[1] = 1;
  }

  // Rules 3 = IF kelembaban Basah, THEN mist Maker Mati
  alpha[2] = getAlphaBasah(y);
  if (alpha[2] >= 0.6) {
    z[2] = 0;
  } else if (alpha[2] >= 0.5 && alpha[2] <= 0.6) {
    z[2] = (0.6 - alpha[2]) / 0.1;
  } else {
    z[2] = 1;
  }

  Serial.println("proses inferensi");
  // Debugging print statements to check the values of z
  for (int i = 0; i < 3; i++) {
    Serial.print("z[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(z[i]);
  }
  Serial.println("End proses inferensi");
}

float defuzzifikasi() {
  // Reset Eaizi dan Eai di awal fungsi
  Eaizi = 0;
  Eai = 0;

  Serial.println("proses Defuzzifikasi");
  for (int i = 0; i < 3; i++) {
    Serial.print("Alpha[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(alpha[i]);
    Serial.print("z[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(z[i]);
    Eaizi += (alpha[i] * z[i]);
    Eai += alpha[i];
  }
  Serial.println("End proses defuzzifikasi");
  Serial.println(Eaizi/Eai);
  return Eaizi / Eai;
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(kipas, OUTPUT);
  pinMode(mistMaker1, OUTPUT);
  pinMode(mistMaker2, OUTPUT);
  setWifi(SSID, PASS);
  Wire.begin();
  lightMeter.begin();

  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  delay(2000);
  float t = dht22.getTemperature();
  int h = dht22.getHumidity();
  float intensitas = lightMeter.readLightLevel();
  float VRL;
  float RS;
  float ratio;

  VRL = analogRead(MQ_sensor) * (5 / 1023.0);     //konversi analog ke tegangan
  RS = (5 / VRL - 1) * 10;                        //rumus untuk RS
  ratio = RS / Ro;                                // rumus mencari ratio
  float ppm = pow(10, ((log10(ratio) - b) / m));  //rumus mencari ppm
  total = total - readings[readIndex];
  readings[readIndex] = ppm;
  total = total + readings[readIndex];
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  average = total / numReadings;

  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" °C\tHumidity: ");
  Serial.print(h);
  Serial.println(" %");
  Serial.print("Light: ");
  Serial.print(intensitas);
  Serial.println(" lx");
  Serial.print("Ammonia (PPM): ");
  Serial.println(average);  // Tampilkan nilai ppm ammonia di serial monitor
  fc_keanggotaanKelembaban(h);
  inferensi(h);
  float hasil = defuzzifikasi();
  
  if (hasil >= 0.5) {
    if (h >= 0 && h < 75 ) {
    digitalWrite(kipas, LOW);
    digitalWrite(mistMaker1, LOW);
    digitalWrite(mistMaker2, LOW);
    Serial.println("hidup semua");
    }
    else if (h >= 75 && h <= 90) {
    digitalWrite(kipas, LOW);
    digitalWrite(mistMaker1, LOW);
    digitalWrite(mistMaker2, HIGH);
    Serial.println("hidup 1");
      
    }
  } else {
    digitalWrite(kipas, HIGH);
    digitalWrite(mistMaker1, HIGH);
    digitalWrite(mistMaker2, HIGH);
    Serial.println("mati semua");
  }
  delay(1000);
  //pengiriman data ke server
  sendData(t, h, intensitas, average);
  delay(5000);
}

void sendData(float temperature, int humidity, float intensitas, float average) {
  if (client.connect("iot.vwxyzar.my.id", 5051)) {
    // if (client.connect("192.168.39.234", 80)) {
    Serial.println("Connected to server. Sending data...");
    String requestData = "temperature=" + String(temperature) + "&humidity=" + String(humidity) + "&intensitas=" + String(intensitas) + "&ammonia=" + String(average);
    client.print("POST /2018067/write-data.php HTTP/1.1\r\n");
    client.print("Host: iot.vwxyzar.my.id\r\n");
    client.print("Content-Type: application/x-www-form-urlencoded\r\n");
    client.print("Content-Length: ");
    client.print(requestData.length());
    client.print("\r\n\r\n");  // Additional line break before the body
    client.print(requestData);
    Serial.println("Data sent.");
  } else {
    resetArduino();
    Serial.println("Connection to server failed.");
  }
  client.stop();  // Menutup koneksi setelah pengiriman data
}
void resetArduino() {
  asm volatile("  jmp 0");
}
Editor is loading...
Leave a Comment