เครื่องหมักปุ๋ยจากเศษอาหารอัตโนมัติ
               ระบบโปรแกรมที่ใช้งานคือโปรแกรมอาดูโน่ ไอดีอี (Arduino IDE)
      อาดูอิโน่ ไอดีอี คือ เครื่องมือการเขียนโปรแกรมที่มีใช้งานได้กับอาดุยอิโน่ได้ทุกรุ่น โดยภายในจะมีเครื่องมือที่จะเป็นสำหรับติดต่ออาดุยอิโน่ เช่น การค้นหาอาดุยอิโน่ ที่ติดต่อกับเครื่องคอมพิวเตอร์ การเลือกรุ่นอาดุยอิโน่ที่ต่ออยู่เพื่อนตรวจสอบว่าขนาดของโปรแกรมที่เขียน หรือไรบรารี่ต่างๆซับพอร์ตกับอาดุยอิโน่รุ่นนั้นๆไหม อีกทั้งยังมีโปรแกรมติดต่อผ่านซีเรียลโดยตรงสำหรับคอมพิวเตอร์



ภาษาที่ใช้เขียนโปรแกรมอาดูโน่ ไอดีอี  (รูปที่ ๑ ตัวอย่างโปรแกรมอาดูโน่ ไอดีอี)
        ภาษาซีของ Arduino จะจัดรูปแบบโครงสร้างของการเขียนโปรแกรมออกเป็นส่วนย่อยๆหลายๆส่วน โดยเรียกแต่ละส่วนว่า ฟังก์ชั่น และ เมื่อนำฟังก์ชั่น มารวมเข้าด้วยกัน ก็จะเรียกว่าโปรแกรม โดยโครงสร้างการเขียนโปรแกรมของ Arduino นั้น ทุกๆโปรแกรมจะต้องประกอบไปด้วยฟังก์ชั่นจำนวนเท่าใดก็ได้ แต่อย่างน้อยที่สุดต้องมีฟังก์ชั่น จำนวน 2 ฟังก์ชั่น คือ setup() และ loop()

                           โครงสร้างพื้นฐานของภาษาซีที่ใช้กับ Arduino นั้น
                                จะประกอบไปด้วย 3 ส่วนใหญ่ๆด้วยกัน คือ
๑. Header ในส่วนนี้จะมีหรือไม่มีก็ได้ ถ้ามีต้องกำหนดไว้ในส่วนเริ่มต้นของโปรแกรม ซึ่งส่วนของ Header ได้แก่ ส่วนที่เป็น Compiler Directive ต่างๆรวมไปถึงส่วนของการประกาศตัวแปร และค่าคงที่ต่างๆที่จะใช้ในโปรแกรม

๒.setup() ในส่วนนี้เป็นฟังก์ชั่นบังคับที่ต้องกำหนดให้มีในทุกๆโปรแกรม ถึงแม้ว่าในบางโปรแกรมจะไม่ต้องการใช้งานก็ยังจำเป็นต้องประกาศไว้ด้วยเสมอ เพียงแต่ไม่ต้องเขียนคำสั่งใดๆไว้ในระหว่างวงเล็บปีกกา {} ที่ใช้เป็นตัวกำหนดของเขตของฟังก์ชั่น โดยฟังก์ชั่นนี้จะใช้สำหรับบรรจุคำสั่งในส่วนที่ต้องกาให้โปรแกรมทำงานเพียงรอบเดียวตอนเริ่มต้นทำงานของโปรแกรมครั้งแรกเท่านั้น ซึ่งได้แก่คำสั่งเกี่ยวกับการ Setup ค่าการทำงานต่างๆ เช่น การกำหนดหน้าที่การใช้งานของ PinMode และการกำหนดค่า Baudrate สำหรับใช้งานพอร์ตสื่อสารอนุกรม เป็นต้น

๓.loop() เป็นส่วนฟังก์ชั่นบังคับที่ต้องกำหนดให้มีในทุกๆโปรแกรมเช่นเดียวกันกับฟังก์ชั่น setup() โดยฟังก์ชั่น loop() นี้จะใช้บรรจุคำสั่งที่ต้องการให้โปรแกรมทำงานเป็นวงรอลซ้ำๆกันไปไม่รู้จบ ซึ่งถ้าเปรียบเทียบกับรูปแบบของ ANSI-C ส่วนนี้ก็คือ ฟังก์ชั่น main() 

                               คำสั่งของระบบเครื่องหมักปุ๋ยจากเศษอาหารอัตโนมัติมีดังนี้ 
#include
#include
#define SensorPin A1            //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00            //deviation compensate
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection
#include "DHT.h"
int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0;    

DHT dht;    //Temp
LiquidCrystal_PCF8574 lcd(0x27);  // set the LCD address to 0x27 for a 16 chars and 2 line display
//ประกาศตัวแปลสำหรับ Sensor Gas
int adcPin = 0;
int adcValue = 0;
float v;
float rs,ppm;
String status_motor = "on";   //กำหนดค่าเริ่มต้นในสตรงเป็นคำว่า on
//Motor
int relay1 = 10; // ต่อกับขา in1 ของบอร์ดรีเลย์
void setup() {
   int error;
   pinMode (buttonPin,INPUT);
   dht.setup(9);              //Set data pin 9
   Serial.begin(9600);        //Set Serial เป็น 9600
   pinMode(relay1, OUTPUT);   //กำหนดเป็น OUTPUT
   digitalWrite(relay1,HIGH); //สั่งให้ Relay เปิด
   Serial.println("LCD...");
   while (! Serial);
   Serial.println("Dose: check for LCD");
   Wire.begin();
   Wire.beginTransmission(0x27);
   error = Wire.endTransmission();
   Serial.print("Error: ");
   Serial.print(error);
   if (error == 0) {
   Serial.println(": LCD found.");
   }else {
     Serial.println(": LCD not found.");
   }
   lcd.begin(20, 4); // initialize the lcd เริ่มต้นใช้ LCD
}

void loop() {
    delay(dht.getMinimumSamplingPeriod());
    float humidity = dht.getHumidity();       // ดึงค่าความชื้น
    float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
    //ประกาศตัวแปร press_num เพื่อรับค่าจาก Serial port
    String press_num ="";
    press_num=char(Serial.read());
    //ควบคุมมอเตอร์โดย กด 1 มอเตอร์จะหยุดทำงาน
    if(press_num == "1"){
      digitalWrite(relay1,LOW);   //สั่งให้มอเตอร์หยุดทำงาน
      Serial.println("Stop");     //แสดงข้อความบน Serial
      status_motor="off";         //กำหนดข้อความในสตริงเป็น off 
    }
    //ควบคุมมอเตอร์โดย กด 2 มอเตอร์จะทำงาน
    if(press_num == "2"){
      digitalWrite(relay1,HIGH);  //สั่งให้มอเตอร์ทำงาน
      Serial.println("Start");    //แสดงข้อความบน Serial
      status_motor="on";          //กำหนดข้อความในสตริงเป็น on
    }

    //Gas   #RS จะลดเมื่อตรวจเจอ Gas
    //อ่านค่าจาก Pin มาเก็บไว้ในตัวแปร adcValue แล้วคำนวณหาค่า RS
    adcValue = analogRead(adcPin);
    v  = adcValue*(5.00/1024);
    rs = (100-(20.00*v))/v;
    delay (1000);

   //PH
   static unsigned long samplingTime = millis();
   static unsigned long printTime = millis();
   static float pHValue,voltage;
   
   if(millis()-samplingTime > samplingInterval)
   {
      pHArray[pHArrayIndex++]=analogRead(SensorPin);
      if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
      voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
      pHValue = 3.5*voltage+Offset;
      samplingTime=millis();
   }
   
   if(millis() - printTime > printInterval)   //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
   {
        Serial.print("Voltage:");
        Serial.print(voltage,2);
        Serial.print("    pH value: ");
        Serial.println(pHValue,2);
        printTime=millis();
   }
    // แสดงข้อความบนจอ
    lcd.home();
    lcd.clear();
    lcd.setBacklight(255);       //Set Backlight 
    lcd.display();
    lcd.setCursor(0, 0);         //Set ตำแหน่งของ Cursor
    lcd.print("Temp:");             //Print ข้อความลงจอ
    lcd.print(temperature, 1);      //Print ข้อความลงจอ
    lcd.setCursor(11, 0);       //Set ตำแหน่งของ Cursor
    lcd.print("RS:");               //Print ข้อความลงจอ
    lcd.print(rs);                  //Print ข้อความลงจอ
    lcd.setCursor(0, 1);        //Set ตำแหน่งของ Cursor
    lcd.print("R.H.:");             //Print ข้อความลงจอ
    lcd.print(humidity, 1);         //Print ข้อความลงจอ
    lcd.setCursor(11, 1);       //Set ตำแหน่งของ Cursor
    lcd.print("PH:");               //Print ข้อความลงจอ
    lcd.print(pHValue,2);           //Print ข้อความลงจอ
    lcd.setCursor(0, 3);        //Set ตำแหน่งของ Cursor
    lcd.print("Status Motor: ");    //Print ข้อความลงจอ
    lcd.print(status_motor);        //Print ข้อความลงจอ
}
//PH
double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    Serial.println("Error number for the array to avraging!/n");
    return 0;
  }
  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i
    amount+=arr[i];
  }
    avg = amount/number;
    return avg;
  }else{
    if(arr[0]
      min = arr[0];max=arr[1];
  }
  else{
      min=arr[1];max=arr[0];
  }
  for(i=2;i
      if(arr[i]
         amount+=min;
         min=arr[i];
      }else {
        if(arr[i]>max){
           amount+=max;
           max=arr[i];
        }else{
           amount+=arr[i];
        }
      }
    }
    avg = (double)amount/(number-2);
  }
  return avg;
}