ระบบโปรแกรมที่ใช้งานคือโปรแกรมอาดูโน่ ไอดีอี (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{ 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; }
|