文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

用Ameba打造智慧盆栽監控器

作者:賴桑

目前市面上已經有很多的開發平台,可是面對琳瑯滿目的選擇,使用者常常不知所以然,這次我介紹的是Realtek推出的Arduino Compatible開發硬體平台Ameba,我利用了Ameba牛刀小試,製作了一個可以連接居家空氣品質、居家光照以及盆栽水位的感測值讀取裝置,當作開箱文。

家庭智慧植物園監控器

家庭智慧植物園監控器

材料清單

點以下連結可以看到各個感測器、模組的詳細說明:
1. Grove – Air Quality Sensor

Grove - Air Quality Sensor

Grove – Air Quality Sensor

2. Grove – Light Sensor

Grove - Light Sensor

Grove – Light Sensor

3. 水位感測模組

水位感測模組

水位感測模組

4. Grove – Base Shield

 Grove - Base Shield

Grove – Base Shield

Ameba系統與接腳描述

1_6

接腳對應位置

接腳對應位置

以下是本文各裝置的實際對應接腳:

  • A0 : Grove – Air Quality Sensor
  • A1 : Grove – Light Sensor
  • A2 : 水位感測模組

原始程式碼:

int i ;
long vol_standard;
int init_voltage;
int first_vol;
int last_vol;
int temp;
int counter;
boolean timer_index;
boolean error;

int current_quality =-1;

void setup()
{
    Serial.begin(9600);

    Serial.println("sys_starting...");
    delay(20000);
    init_voltage=analogRead(0);
    Serial.println("The init voltage is ...");
    Serial.println(init_voltage);
    while(init_voltage)
    {
        if(init_voltage<798 && init_voltage>10)// the init voltage is ok
        {
            first_vol=analogRead(0);//initialize first value
            last_vol=first_vol;
            vol_standard=last_vol;
            Serial.println("Sensor ready.");
            error=false;;
            break;
        }
        else if(init_voltage>798||init_voltage<=10)
        {	
            i++;
            delay(60000);//60000
            Serial.println("waitting sensor init..");
            init_voltage=analogRead(0);
            if(i==5)
            {
                i=0;
                error=true;
                Serial.println("Sensor Error!");
            }
          }
        else 
        break;
    }
}

void avgVoltage()
{
	if(i==150)//sum 5 minutes
	{
		vol_standard=temp/150; 
		temp=0;
		Serial.print("Vol_standard in 5 minutes:");			
		Serial.println(vol_standard);		
		i=0;		
	}
    else 
	{
		temp+=first_vol;
		i++;
	}
}

int slope(void)
{
    while(timer_index)
	{
    	if(first_vol-last_vol>400||first_vol>700)
        {
            Serial.println("High pollution! Force signal active.");		
            timer_index=0;	
            avgVoltage();	
            return 0;	
        }
    	else if((first_vol-last_vol>400&&first_vol<700)||first_vol-vol_standard>150)
        {	
            Serial.print("sensor_value:");		
            Serial.print(first_vol);      		
            Serial.println("\t High pollution!");		
            timer_index=0;	
            avgVoltage();
            return 1;
            
        }
    	else if((first_vol-last_vol>200&&first_vol<700)||first_vol-vol_standard>50)
        {
            //Serial.println(first_vol-last_vol);
            Serial.print("sensor_value:");
            Serial.print(first_vol);      		
            Serial.println("\t Low pollution!");		
            timer_index=0;
            avgVoltage();
            return 2;	
        }
    	else
        {
            avgVoltage();	
            Serial.print("sensor_value:");
            Serial.print(first_vol);
            Serial.println("\t Air fresh");
            timer_index=0;
            return 3;
        }
	}
    return -1;
}

void loop()
{
	current_quality= slope();
    if (current_quality >= 0)// if a valid data returned.
    {
        if (current_quality==0)
            Serial.println("High pollution! Force signal active");
        else if (current_quality==1)
            Serial.println("High pollution!");
        else if (current_quality==2)
            Serial.println("Low pollution!");
        else if (current_quality ==3)
            Serial.println("Fresh air");

        Serial.print("Photo-resistor: ");
        Serial.println(analogRead(1));
        Serial.print("Water level: ");
        Serial.println(analogRead(2));
    }

    delay(10);      //Adjust here to make the time interval gets close to
                     //2 seconds
    virtualTimer();
}

void virtualTimer()  //Intel didn't support Timer2 ISR
{
	if(counter==122)//set 2 seconds as a detected duty
	{

			last_vol=first_vol;
			first_vol=analogRead(0);
			counter=0;
			timer_index=1;
	}
	else
	{
		counter++;
	}
}

基本原理解說

系統大約需要兩分鐘啟動,使得Grove – Air Quality Sensor能夠取樣進入穩定狀態,接著每次程式會以大約兩秒為間隔,求取A0、A1、A2的讀值,然後回報;這三個感測器A0、A2都是與感測目標成正比關係,也就是說汙染程度越高,A0會得到越高的讀值,水位越高A2的讀值也相對升高;只有A1,會因為遮蔽產生光照不足而讀值越低。

整個系統架構及實作過程可參考以下影片:

結語

Ameba的設計就是一個強過Arduino Due的Arduino!執行效能非常高,因為本身就是ARM Cortex系列的CPU為基礎開發的,此外還外帶了內建的WiFi、NFC reader,在很多Arduino應用的場合,根據價格、性能兩項來比較,確實有其優勢。

賴建宏

賴建宏

社群稱號為「賴桑」的他,以電子電機的背景,熱衷於OSHW的應用開發與實作。現為台北科技大學電子所博士班學生,目前主推「農林漁牧大業」計畫的迷你型魚菜共生系統開發。
賴建宏

上一篇: | 下一篇:

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO