Sensor fingerprint

Sidik jari adalah guratan pada jari yang bersifat unik dan permanen. ilmu yang mempelajari sidik jari (daktiloskopi), menyatakan bahwa gelombang fleksibel pada sidik jari tidak ada yang sama persis satu dengan lainnya.

untuk membaca sidik jari secara digital bisa dilakukan dengan langkah berikut :

  1. Mengambil gambar sidik jari, jenis sensor yang umum digunakan adalah : Optic Reflexive, Optic Transmissive with Fiber Optic Plate, Optical Line, Capacitive Line, Thermal Line, Pressure Sensitive, Dynamic Capacitive, Static Capacitive, Acoustic.
  2. Membuat fitur-fitur biometrik sidik jari dalam bentuk digital.
  3. Menyimpan data sidik jari dalam database.

Penetapan fitur-fitur biometrik sidik jari adalah proses paling penting dalam identifikasi. fitur yang signifikan diantaranya:

Pola

Jenis pola yang umum ditemukan:

pola busur pola ikal pola melingkar pola tenda

 

Fitur khusus

Fitur penentu identifikasi

Fitur garis putus fitur cabang fitur garis pendek

gambar sidik jari yang diambil kemudian diproses secara digital untuk mencari pola dan menyimpan fitur-fitur yang ditemukan, semakin banyak fitur yang diperoleh maka keakuratan dalam pencocokan sidik jari semakin besar.

Bagi anak-anak atau orang dewasa yang memiliki sidik jari tipis, sebaiknya menggunakan sensor jenis kontak langsung (direct contact).

Perhitungan regresi linear menggunakan arduino

Statistik regresi linear berfungsi mencari nilai trend suatu variabel terhadap pengaruh variabel lainnya. Fungsi regresi linear berupa persamaan grafis yang menyatakan perbedaan nilai dalam rentang/interval tertentu sehingga bisa dianalisis sebagai akibat dari perbedaan variabel input (variabel masukan/ variabel bebas/independen).

Jika diketahui variabel X1..Xn yang mempengaruhi variabel Y1..Yn maka persamaan regresi linear umum/sederhana adalah:

dimana m adalah gradien (kemiringan) dan b adalah konstanta.

source code regresi linear arduino:

struct sample
{
  byte waktu;
  float data;
};

void setup() {
  Serial.begin(9600);
  Serial.println("Statistik regresi linear dengan Arduino");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();
}

void loop() {
  sample Pengukuran[] = {
    {1, 21.2},
    {2, 28.5},
    {3, 42.3},
    {4, 53.9},
    {5, 57.1},
    {6, 70.2},
    {7, 79.9},
    {8, 89.2},
    {9, 101.6},
    {10, 112.4},
  };

  float m;
  float b;

  regresiLinear(Pengukuran, 10, &m, &b);

  Serial.print("m = ");
  Serial.println(m);
  Serial.print("b = ");
  Serial.println(b);
  Serial.print("Prediksi waktu ke-11 = ");
  Serial.println(m * 11 + b);

  while (1);
}

void regresiLinear(sample *sampling, byte jumlahSampling, float *m, float *b)
{
  byte jumlahWaktu = 0;
  float jumlahData = 0.0;
  uint32_t jumlahDataWaktu = 0;
  uint32_t jumlahWaktu2 = 0;
  float jumlahData2 = 0.0;
  for (byte i = 0; i < jumlahSampling; i++)
  {
    jumlahWaktu += sampling[i].waktu;
    jumlahData += sampling[i].data;
    jumlahDataWaktu += (sampling[i].waktu * sampling[i].data);
    jumlahWaktu2 +=  (sampling[i].waktu *  sampling[i].waktu);
    jumlahData2 +=  (sampling[i].data *  sampling[i].data);
  }
  *m = (jumlahSampling * jumlahDataWaktu) - (jumlahWaktu * jumlahData);
  *m /= (jumlahSampling * jumlahWaktu2) - (jumlahWaktu * jumlahWaktu);

  *b = (jumlahWaktu2 * jumlahData) - (jumlahWaktu * jumlahDataWaktu);
  *b /= (jumlahSampling * jumlahWaktu2) - (jumlahWaktu * jumlahWaktu);
}

contoh keluaran serial monitor:

Statistik nilai mean, median dan modus menggunakan arduino

Pembacaan nilai analog arduino sering memberikan hasil dengan simpangan dari nilai yang seharusnya. Untuk mengurangi kesalahan ini kita bisa mengambil nilai rata-rata dari beberapa sample. ada beberapa metode untuk mencari nilai pendekatan pembacaan sensor ini yaitu:

Mean (nilai rata-rata)

adalah nilai tengah dari kelompok data yaitu dengan menjumlahkan seluruh data individu dan kemudian membaginya dengan jumlah individu tersebut.

dalam sketch arduino nilai mean dituliskan:

  float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1};
  byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]);

  float jumlah = 0;
  for (int i = 0; i < jumlahSampel; i++)
  {
    jumlah += Sampel[i];
  }
  float mean = jumlah / jumlahSampel;
  Serial.print("mean = ");
  Serial.println(mean);

Median (nilai tengah)

adalah nilai yang letaknya ditengah-tengah dari data yang telah diurutkan dari yang terkecil.

contoh penggunaan median pada arduino:

  float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1};
  byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]);

  urutkanSampel(Sampel, jumlahSampel);
  float median = Sampel[(byte)(jumlahSampel / 2)];
  if (!(jumlahSampel % 2))
  {
    median += Sampel[(byte)(jumlahSampel / 2) - 1];
    median /= 2;
  }
  Serial.print("median = ");
  Serial.println(median);

Modus (Data paling sering)

Adalah data yang paling sering muncul (frekuensi tertinggi) dan tidak ada yang sama dengan frekuensi tersebut.

Contoh penggunaan mean, median dan modus pada arduino:

void setup() {
  Serial.begin(9600);
  Serial.println("Mean, media, modus dengan Arduino");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();
}

void loop() {
  float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1};

  byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]);
  float jumlah = 0;
  for (int i = 0; i < jumlahSampel; i++)
  {
    jumlah += Sampel[i];
  }
  float mean = jumlah / jumlahSampel;
  Serial.print("mean = ");
  Serial.println(mean);

  urutkanSampel(Sampel, jumlahSampel);
  float median = Sampel[(byte)(jumlahSampel / 2)];
  if (!(jumlahSampel % 2))
  {
    median += Sampel[(byte)(jumlahSampel / 2) - 1];
    median /= 2;
  }
  Serial.print("median = ");
  Serial.println(median);

  float modus;
  Serial.print("modus = ");
  if(cariModus(Sampel, jumlahSampel, &modus))
  {
    Serial.println(modus);
  }
  else
  {
    Serial.println("tidak ada");
  }
  
  while (1);
}

void urutkanSampel(float *dataArray, byte jumlahData)
{
  byte i = 0;
  for (byte i = 0; i < jumlahData; i++)
  {
    byte k;
    for (byte j = 1; j < jumlahData; j++)
    {
      if (dataArray[j - 1] > dataArray[j])
      {
        float temp = dataArray[j - 1];
        dataArray[j - 1] = dataArray[j];
        dataArray[j] = temp;
      }
    }
  }
}
bool cariModus(float *dataArray, byte jumlahData, float *modus)
{
  byte frekuensi;
  float frekuensiData;
  byte frekuensiMax = 0;
  byte frekuensiMaxCount = 0;
  *modus = 0;
  for (byte i = 0; i < jumlahData; ++i)
  {
    frekuensi = 0;
    for (byte j = 0; j < jumlahData; j++)
    {
      if (dataArray[i] == dataArray[j])
      {
        frekuensi++;
      }
    }
    if(frekuensiMax < frekuensi)
    {
      frekuensiMax = frekuensi;
      frekuensiData = dataArray[i];
      *modus = dataArray[i];
      frekuensiMaxCount = 0;
    }
    else if((frekuensiMax == frekuensi) && (frekuensiData != dataArray[i]))
    {
      frekuensiMaxCount++;
    }
  }
  if(!frekuensiMaxCount)
  {
    return true;
  }
  return false;
}

Kalibrasi arduino

Sensor-sensor perlu dikalibrasi terlebih dahulu untuk mendapatkan hasil yang terukur. Kalibrasi sensor arduino membutuhkan alat pengukur lainnya yang telah terkalibrasi/ditera. Tahap Kalibrasi merupakan tahapan percobaan dengan membandingkan hasil yang terukur oleh arduino dengan hasil yang terukur oleh alat kalibrasi.

Jika proses kalibrasi sulit dilakukan (tidak punya alat kalibrasi), kita bisa melakukan proses kalibrasi menggunakan pendekatan teoritis yaitu berdasarkan kurva/grafik yang diperoleh dari datasheet sensor tersebut.

Dalam kondisi kebutuhan sensor akurasi tinggi, perancang diharuskan memilih komponen yang tepat dan yang paling penting adalah proses kalibrasi, karena kondisi teoritis dari pabrik belum tentu sesuai dengan kondisi di lapangan.

Kalibrasi crystal RTC 32.768 Hz / 32.000Hz

Komponen kristal kuartsa merupakan pembangkit gelombang dengan frekuensi yang sudah dikalibrasi oleh pabrik pembuatnya. Namun kristal yang umum digunakan masih bergantung pada suhu operasi, dimana frekuensi keluarannya bergantung pada suhu kristal tersebut.

pada DS1307, proses kalibrasi RTC sulit dilakukan karena chip DS1307/1302 tidak memiliki register kalibrasi, proses kalibrasi yang bisa dilakukan adalah dengan penambahan ofset waktu pada kontroller/arduino misalnya dengan penambahan 1 detik / hari atau 3 detik per 30 hari dst.

pada DS3231/3232, chip ini sudah memiliki kalibrasi sendiri (temperatur conpensation)

Kalibrasi sensor analog arduino

Pembacaan sensor analog pada arduino menggunakan perintah analogWrite() harus memperhatikan hal berikut:

  • ADC arduino juga memiliki faktor kesalahan akurasi (offset, gain, Integral Non-linearity dan Differential Non-linearity).
  • Faktor konversi nilai digital dari adc ke nilai sebenarnya.
  • Tegangan Vref yang digunakan.

Kalibrasi sensor lebar pulsa

Sensor yang bekerja dengan menghitung lebar pulsa seperti sensor kecepatan dan sensor jarak (echo) harus memperhatikan faktor berikut:

  • Situasi sensor bebas dari objek lain yang mungkin terdeteksi.
  • Untuk hasil yang akurat, gunakan pembacaan dengan detail tinggi, misalnya timer dengan prescaler 1 dan juga matikan fungsi interupsi untuk memastikan tick waktu mulai dan tick waktu selesainya benar-benar terdeteksi.

Mengatur kecepatan servo dengan arduino

Motor servo dikendalikan oleh lebar sinyal (PWM) yang berbanding lurus dengan posisi tap potensio pada kontrol-nya. Oleh karena itu kecepatan servo bergantung pada perbedaan antara nilai setara dari sinyal PWM dan nilai analog potensio yang ada pada motor servo. Semakin besar perbedaannya maka kecepatannya akan semakin tinggi, begitu juga sebaliknya, jika nilai setara-nya sama maka kecepatan servo = 0.

Untuk mengontrol kecepatan servo, dibutuhkan suatu fungsi yang menggerakkan servo setiap derajat perpindahannya (0..180) dengan penambahan waktu jeda diantaranya.

Skema mengendalikan kecepatan servo:

Dan fungsi pengaturan kecepatan servo dalam contoh sketch:

#include <Servo.h>

#define pinServo A0
Servo myservo;

void setup() {
  Serial.begin(9600);
  Serial.println("Mengatur kecepatan servo");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();

  myservo.attach(pinServo);
  myservo.write(0);
  delay(500);
}

void loop() {
  //servoSpeed(Servo servo, int sudut, uint8_t Speed)
  servoSpeed(myservo, 180, 255);//speed dalam derajat/ms
  servoSpeed(myservo, 0, 200);
  servoSpeed(myservo, 180, 150);
  servoSpeed(myservo, 0, 100);
  servoSpeed(myservo, 180, 50);
  servoSpeed(myservo, 0, 0);//berhenti

  while (1);
}

void servoSpeed(Servo servo, int sudut, uint8_t Speed)
{
  if(Speed == 0)
  {
    return;
  }
  int posisiSekarang = servo.read();
  for (int i = posisiSekarang; i != sudut; (posisiSekarang > sudut) ? i-- : i++)
  {
    servo.write(i);
    if (Speed > 174)
    {
      delayMicroseconds((256 - Speed) * 200);//0.12 detik/60 derajat
    }
    else
    {
      delay((uint16_t)(256 - Speed) * 0.2f);//0.12 detik/60 derajat
    }
  }
  servo.write(sudut);
}

Selisih dari dua tanggal menggunakan Arduino

Menentukan selisih tanggal menggunakan Arduino bisa memanfaatkan library TimeLib.h, namun metode ini hanya valid dari tahun 1970.

Selisih tanggal ini bisa dipergunakan untuk menentukan umur, hari ulang tahun, hitung mundur suatu kegiatan dan lain-lain.

Mengurang dua tanggal (datetime) pada arduino dengan TimeLib.h diperoleh dari pengurangan jumlah hari pada tanggal-tanggal tersebut terhitung dari 1 Januari 1970. Setelah operasi pengurangan dua tanggal tersebut, hasilnya diperoleh dalam bentuk jumlah hari (integer) untuk selanjutnya dikonversi menjadi hari, bulan dan tahun.

Berikut kode program selisih tanggal dengan arduino:

#include <TimeLib.h>

void setup() {
  Serial.begin(9600);
  Serial.println("Selisih dari dua tanggal menggunakan Arduino");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();
}

void loop() {
                                //dtk,mnt,jam,hari,tgl,bln,tahun
  tmElements_t tanggalPertama = {0,0,0,0,5,9,CalendarYrToTm(1985)};//valid diatas 1970
  tmElements_t tanggalKedua = {0,0,0,0,21,4,CalendarYrToTm(2018)};//valid diatas 1970
  tmElements_t selisih;
  breakTime(makeTime(tanggalKedua) - makeTime(tanggalPertama), selisih);

  Serial.print("Tanggal pertama = ");
  Serial.print(tanggalPertama.Day);
  Serial.print("/");
  Serial.print(tanggalPertama.Month);
  Serial.print("/");
  Serial.println(tmYearToCalendar(tanggalPertama.Year));

  Serial.print("Tanggal kedua = ");
  Serial.print(tanggalKedua.Day);
  Serial.print("/");
  Serial.print(tanggalKedua.Month);
  Serial.print("/");
  Serial.println(tmYearToCalendar(tanggalKedua.Year));

  Serial.print("Selisih = ");
  Serial.print(selisih.Day);
  Serial.print(" hari ");
  Serial.print(selisih.Month);
  Serial.print(" bulan ");
  Serial.print(selisih.Year);
  Serial.println(" tahun");

  while(1);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

hasil serial monitor pengurangan tanggal dengan arduino:

Prediksi Extrapolation dengan Arduino

Ekstrapolasi (Extrapolation) adalah proses matematis untuk memprediksi nilai yang akan datang berdasarkan keterkaitan matematis dari nilai-nilai sebelumnya.

Dalam contoh ini akan diprediksi nilai sinus 60° dari deret sinusional sin-0, 10, 20, 30, 40, 50. Pendekatan yang digunakan adalah linear dan polynomial (quadratic, cubic, quartic dan quintic), menggunakan operasi matrik. Formula matematis ini dikerjakan dengan bantuan arduino Uno.

dan hasilnya adalah:

  • Seharusnya (sinus(60) * 1000) = 866.02
  • Linear Extrapolation = 889.34
  • Polynomial Extrapolation (quadratic)= 869.84
  • Polynomial Extrapolation (cubic) = 865.54
  • Polynomial Extrapolation (quartic) = 904.61
  • Polynomial Extrapolation (quintic) = 866.39

Berikut sketch/koding ekstra polasi arduino:

Link download library MatrixMath

#include <MatrixMath.h>

float dataSinus[] = {0.0, 173.64, 342.02, 500.00, 642.78, 766.06};// -- 866.02

void setup() {
  Serial.begin(9600);
  Serial.println("Prediksi Extrapolation dengan Arduino");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();

  byte indexTerakhir = sizeof(dataSinus) / sizeof(float) - 1;

  Serial.print("Seharusnya (sinus(60) * 1000) = ");
  Serial.println(866.02);

  float prediksi;
  prediksi = linearExtrapolation(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1]);
  Serial.print("Linear Extrapolation = ");
  Serial.println(prediksi);
  
  prediksi = polynomialExtrapolationQuadratic(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2]);
  Serial.print("Polynomial Extrapolation (quadratic)= ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationCubic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3]);
  Serial.print("Polynomial Extrapolation (cubic) = ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationQuartic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3], 
    dataSinus[indexTerakhir - 4]);
  Serial.print("Polynomial Extrapolation (quartic) = ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationQuintic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3], 
    dataSinus[indexTerakhir - 4], 
    dataSinus[indexTerakhir - 5]);
  Serial.print("Polynomial Extrapolation (quintic) = ");
  Serial.println(prediksi);

  while (1);
}

void loop() {

}

float linearExtrapolation(float dataN, float dataNminus1)
{
  return dataNminus1 + (2 * (dataN - dataNminus1));
}
float polynomialExtrapolationQuadratic(float dataN, float dataNminus1, float dataNminus2)
{
  float A[3][3] = {{1.0, 0.0, 0.0},
    {1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0}
  };
  float B[3] = {dataNminus2, dataNminus1, dataN};
  float C[3];

  Matrix.Invert((float*)A, 3);
  Matrix.Multiply((float*)A, (float*)B, 3, 3, 1, (float*)C);

  return(C[0] + (C[1] * 3.0) + (C[2] * 9.0));
}

float polynomialExtrapolationCubic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3)
{
  float A[4][4] = {
    {1.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0},
    {1.0, 3.0, 9.0, 27.0}
  };
  float B[4] = {dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[4];

  Matrix.Invert((float*)A, 4);
  Matrix.Multiply((float*)A, (float*)B, 4, 4, 1, (float*)C);

  return(C[0] + (C[1] * 4.0) + (C[2] * 16.0) + (C[3] * 64.0));
}

float polynomialExtrapolationQuartic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4)
{
  float A[5][5] = {
    {1.0, 0.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0, 16.0},
    {1.0, 3.0, 9.0, 27.0, 81.0},
    {1.0, 4.0, 8.0, 64.0, 256.0}
  };
  float B[5] = {dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[5];

  Matrix.Invert((float*)A, 5);
  Matrix.Multiply((float*)A, (float*)B, 5, 5, 1, (float*)C);

  return(C[0] + (C[1] * 5.0) + (C[2] * 25.0) + (C[3] * 125.0) + (C[4] * 625.0));
}

float polynomialExtrapolationQuintic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4, float dataNminus5)
{
  float A[6][6] = {
    {1.0, 0.0, 0.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0, 16.0, 32.0},
    {1.0, 3.0, 9.0, 27.0, 81.0, 243.0},
    {1.0, 4.0, 8.0, 64.0, 256.0, 1024.0},
    {1.0, 5.0, 25.0, 125.0, 625.0, 3125.0}
  };
  float B[6] = {dataNminus5, dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[6];

  Matrix.Invert((float*)A, 6);
  Matrix.Multiply((float*)A, (float*)B, 6, 6, 1, (float*)C);

  return(C[0] + (C[1] * 6.0) + (C[2] * 36.0) + (C[3] * 216.0) + (C[4] * 1296.0) + (C[5] * 7776.0));
}

hasil Serial monitor:

Sumber tegangan negatif menggunakan PWM (Arduino)

Sumber tegangan negatif beguna untuk :

  1. Pengatur kontras (contrast adjustment) pada LCD karakter
  2. Sumber tegangan negatif pada opamp simetris
  3. Dan keperluan lain

Suplai tegangan negatif bisa diperoleh dari:

  1. Baterai dengan menjadikan terminal positif (+) menjadi ground, maka otomatis terminal negatif (-) menjadi sumber tegangan negatif.
  2. Memanfaatkan rangkaian charge pump.

rangkaian charge pump:

Rangkaian ini memerlukan suplai PWM yang bisa dihasilkan dari arduino dengan analogWrite().

Agar keluaran tegangan negatif bisa diatur, maka tambahkan potensio 10KΩ pada keluarannya.

Fungsi map untuk bilangan pecahan/float pada Arduino

Fungsi map() pada arduino IDE akan mengkonversikan suatu bilangan dalam suatu rentang ke rentang bilangan lain. Namun pada Arduino IDE map yang tersedia hanya untuk bilangan integer.

Bagaimana jika kita menginginkan fungsi map untuk bilangan pecahan/float:

  1. Faktor kali, yaitu dengan mengalikan rentang tujuan sehingga menjadi integer misalnya dikalikan dengan 10, 100 dan kemudian dibagi lagi dengan bilangan pengali tersebut contohnya:
    float x1 = map(adc, 0, 1023, 87 * 100, 108 * 100) / 100.0;
    
  2. Dengan modifikasi fungsi map untuk mengakomodir bilangan pecahan, seperti terlihat pada contoh sketch dibawah.

Skema pengujian fungsi map pecahan:

contoh sketch/program/koding penggunaan fungsi map pecahan:

void setup() {
  Serial.begin(9600);
  Serial.println("Fungsi map untuk bilangan pecahan/float");
  Serial.println("https://www.project.semesin.com/");
}

void loop() {
  uint16_t adc = analogRead(A0);

//Range/bentang asal adc = 0..1023
//Range/bentang tujuan   = 87.00 - 108.00

  float x1 = map(adc, 0, 1023, 87 * 100, 108 * 100) / 100.0;
  float x2 = mapPecahan(adc, 0, 1023, 87, 108);
  
  Serial.print(adc);
  Serial.print(" => ");
  Serial.print(x1, 2);
  Serial.print(" == ");
  Serial.println(x2, 2);

  delay(1000);
}

float mapPecahan(long x, long fromLow, long fromHigh, float toLow, float toHigh)
{
  return (x - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;
}

Prototipe pengkondisi suhu ruangan dengan perintah SMS

Prototipe ini merupakan aplikasi pengkondisi suhu ruangan kandang ayam berbasis SMS gateway/SMS server.

Kelebihan:

  1. Profil kondisi untuk ayam kecil, sedang dan besar.
  2. Mengeluarkan suara terjadwal anti stress bagi ayam
  3. Monitoring melalui SMS
  4. Pengaturan melalui SMS

Kelengkapan:

  1. Arduino Mega 2560
  2. Modem Wavecom fastrack supreme 10
  3. modul RTC DS1307
  4. DHT 11
  5. Modul max232
  6. Kipas 12v
  7. Elemen pemanas
  8. Relay 1 channel

link album: Galeri pengkondisi suhu ruangan