2. Baca sensor dengan Arduino

Arduino bertugas untuk membaca sensor dan menghitung berapa kali sensor mendeteksi warna hitam dalam selang waktu 15 menit, atau dengan kata lain, berapa banyak jumlah putaran piringan dalam waktu 15 menit. Kemudian Arduino juga akan mengubah jumlah putaran tersebut dalam bentuk nilai daya listrik dan nilai KWHmeter. Rumus untuk menghitung nilai KWH dan daya listriknya adalah sebagai berikut:

KWH = jumlah putaran / 720
daya listrik = 3600 x KWH / 900

di mana angka 720 saya ambil dari nilai perbandingan pada KWHmeter di rumah saya, yang tertulis 720 PUT/KWH atau 720 putaran untuk 1 KWH-nya. Sedangkan 3600 adalah jumlah detik dalam 1 jam, dan 900 adalah jumlah detik dalam 15 menit. Satuan nilai daya listrik pada rumus di atas adalah kiloWatt/detik. Untuk menghasilkan nilai yang lebih "terbaca", maka rumus daya listrik diubah menjadi sebagai berikut:

daya listrik = 1000 x 3600000 x KWH / 900000

dengan satuan daya listrik pada rumus di atas adalah Watt/milidetik.

Berikut kode program untuk Arduino:
#undef int()
int totalRequests = 0;
int revsPerkWh = 720; //nilai perbandingan KWHmeter
unsigned long time;
unsigned long interval;
unsigned long currentPower;
boolean black = false;
unsigned long aggregatedRevCounter;
unsigned long totalRevCounter;
unsigned long kWh;
unsigned long aggregatedInterval = 900000; // 15 menit
unsigned long aggregatedTime;
unsigned long aggregatedPower;
unsigned long reportedAggregatedPower;
int sensorDelay = 20;
int powerPin = 2;
int averageAnalog[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000};
void setup(){
  Serial.begin(9600); 
  Serial.println("starting...");
  setupPower();
}
void loop(){
  checkPower();
}
void setupPower(){
  pinMode(powerPin, OUTPUT);
  time = millis();
  interval = 0;
  currentPower = 0;
  aggregatedPower = 0;
  aggregatedTime = millis();
  aggregatedRevCounter = 0;
  reportedAggregatedPower = 0; 
}
void checkPower(){
  digitalWrite(powerPin, HIGH);
  delay(sensorDelay);
  int sensorVal = analogRead(0);
  for (int k = 0; k <7; k++){   
    averageAnalog[k] = averageAnalog[k+1];    
  }
  averageAnalog[7] = sensorVal;
  int firstAverage = 0;
  for (int k = 0; k <5; k++){   
    firstAverage += averageAnalog[k];  
  }
  firstAverage = firstAverage / 5;
  int secondAverage = 0;
  for (int k = 5; k <8; k++){   
    secondAverage += averageAnalog[k];  
  }
  secondAverage = secondAverage / 3;
  float proportion = (float)secondAverage /  (float)firstAverage;
  int prop = 1000 * proportion;
  if (black == false){
  if (prop > 1100){
      long currentTime = millis();
      black = true;
      interval = currentTime - time;
      currentPower = (1000.0 * 3600000.0 / interval) / revsPerkWh;
      kWh = (++totalRevCounter * 1000) / revsPerkWh;
      aggregatedRevCounter++;
      aggregatedPower += currentPower;
      if ((currentTime - aggregatedTime) > aggregatedInterval){
        reportedAggregatedPower = aggregatedPower / aggregatedRevCounter;
        aggregatedPower = 0;
        aggregatedTime = currentTime;
        aggregatedRevCounter = 0;
      }
      Serial.print(currentPower,DEC);
      Serial.print(',');
      Serial.println(kWh,DEC);
     time = millis();
   }
  } 
  else {
    if (prop < 1101){
      black = false; 
    }
  }
  digitalWrite(powerPin, LOW);
  delay(5 * sensorDelay);
}

Kode program di atas sebenarnya saya peroleh dari http://community.pachube.com/files/officeSensorsExample.zip, dengan sedikit pengubahan. Saya suka dengan ide pembacaan sensor dalam program tersebut, yang menggunakan rata-rata dari nilai yang terbaca, dan kemudian membandingkannya dengan nilai sebelumnya untuk melihat apakah ada perubahan nilai. Apabila terjadi perubahan nilai, berarti sensor telah mendeteksi warna hitam. Dengan ide ini, maka pembacaan sensor tidak lagi terpengaruh pada cahaya di sekitar KWHmeter, yang selalu berubah-ubah dari pagi hingga malam hari. Thanks buat Usman Haque dan tim Pachube.

Berikut hasil pembacaan sensor yang dilihat menggunakan Serial Monitor pada software Arduino:


Tidak ada komentar:

Posting Komentar