本帖最后由 MOPPLAYER 于 2016-3-16 01:51 编辑
前言:
經過三篇的分析和介紹,本篇將實際整合出一套系統並且實際使用這套系統,目前已經啟用中,並且附上大量的圖片供小伙伴們參考,並結束本項目,做個總結
準備:
0. 前三篇所設計好的原型
1. 延長線或電源插座,會使用到兩孔
2. 防水盒,放置所有板子
3. 螺絲起子和M3螺絲釘
之前文章的匯總:
【LeMaker Guitar试用体验】安裝系統和檢測
【LeMaker Guitar试用体验】居家水族箱 (1)
【LeMaker Guitar试用体验】居家水族箱 (2)
【LeMaker Guitar试用体验】居家水族箱 (3)
實作:
1. 將第二篇的程式碼加以優化,主要是增加溫度取值異常時候要自動關閉繼電器模組,完整程式碼如下:
- #include
- #include "gpio.h"
- #include
- #include <time.h>
- #define IN1 131
- #define IN2 130
- #define IN3 50
- #define IN4 64
- #define DS18B20_PATH "/sys/bus/w1/devices/28-021564c894ff/w1_slave"
- #define RELAY 90
- #define TEMP_HIGH 28
- #define TEMP_LOW 24
- #define SPEED 1000
- #define DEGREE180 256
- void turnCounter()
- {
- s500_mmio_set_high(IN1);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN4);
- usleep(SPEED);
- s500_mmio_set_high(IN1);
- s500_mmio_set_high(IN2);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN4);
- usleep(SPEED);
- s500_mmio_set_low(IN1);
- s500_mmio_set_high(IN2);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN4);
- usleep(SPEED);
- s500_mmio_set_low(IN1);
- s500_mmio_set_high(IN2);
- s500_mmio_set_high(IN3);
- s500_mmio_set_low(IN4);
- usleep(SPEED);
- s500_mmio_set_low(IN1);
- s500_mmio_set_low(IN2);
- s500_mmio_set_high(IN3);
- s500_mmio_set_low(IN4);
- usleep(SPEED);
- s500_mmio_set_low(IN1);
- s500_mmio_set_low(IN2);
- s500_mmio_set_high(IN3);
- s500_mmio_set_high(IN4);
- usleep(SPEED);
- s500_mmio_set_low(IN1);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN3);
- s500_mmio_set_high(IN4);
- usleep(SPEED);
- s500_mmio_set_high(IN1);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN3);
- s500_mmio_set_high(IN4);
- usleep(SPEED);
- }
- void turn()
- {
- s500_mmio_set_high(IN4);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN1);
- usleep(SPEED);
- s500_mmio_set_high(IN4);
- s500_mmio_set_high(IN3);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN1);
- usleep(SPEED);
- s500_mmio_set_low(IN4);
- s500_mmio_set_high(IN3);
- s500_mmio_set_low(IN2);
- s500_mmio_set_low(IN1);
- usleep(SPEED);
- s500_mmio_set_low(IN4);
- s500_mmio_set_high(IN3);
- s500_mmio_set_high(IN2);
- s500_mmio_set_low(IN1);
- usleep(SPEED);
- s500_mmio_set_low(IN4);
- s500_mmio_set_low(IN3);
- s500_mmio_set_high(IN2);
- s500_mmio_set_low(IN1);
- usleep(SPEED);
- s500_mmio_set_low(IN4);
- s500_mmio_set_low(IN3);
- s500_mmio_set_high(IN2);
- s500_mmio_set_high(IN1);
- usleep(SPEED);
- s500_mmio_set_low(IN4);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN2);
- s500_mmio_set_high(IN1);
- usleep(SPEED);
- s500_mmio_set_high(IN4);
- s500_mmio_set_low(IN3);
- s500_mmio_set_low(IN2);
- s500_mmio_set_high(IN1);
- usleep(SPEED);
- }
- int main(int argc, char *argv[])
- {
- int i;
- time_t t;
- struct tm* now;
- int ss=atoi(argv[3]);
- int mm=atoi(argv[2]);
- int hh=atoi(argv[1]);
- int test=atoi(argv[4]);
- int fd =0;
- char crc_buf[4]={};
- char temp_buf[10]={};
- float temp;
- if (s500_mmio_init() < 0) {
- printf("error open mem!n");
- }
- set_max_priority();
- s500_mmio_set_output(IN1);
- s500_mmio_set_output(IN2);
- s500_mmio_set_output(IN3);
- s500_mmio_set_output(IN4);
-
- s500_mmio_set_output(RELAY);
- time(&t);
- now = localtime(&t);
-
- printf("System starting on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);
- printf("Setting time on %dn", ss);
-
- while(1)
- {
- fd= open(DS18B20_PATH, O_RDONLY);
- if(fd < 0)
- {
- perror("w1_device:");
- s500_mmio_set_low(RELAY);
- }
- else
- {
- pread(fd,crc_buf,sizeof(crc_buf),36);
-
- if(strncmp(crc_buf,"YES",3)!=0)
- {
- printf("CRC error, so drop it!n");
- s500_mmio_set_low(RELAY);
- }
- else
- {
- pread(fd,temp_buf,sizeof(temp_buf),69);
- temp=(float)atoi(temp_buf)/1000;
- printf("Temp= %fn",temp);
-
- if(temp > TEMP_HIGH)
- s500_mmio_set_low(RELAY);
- else if (temp < TEMP_LOW)
- s500_mmio_set_high(RELAY);
- }
- }
- time(&t);
- now = localtime(&t);
- if(test==0 && now->tm_sec==ss && now->tm_min==mm && now->tm_hour==hh)
- {
- printf("Feeding food on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);
- for(i=0;i
- {
- turnCounter();
-
- }
- for(i=0;i
- {
- turn();
-
- }
- }
- else if(test==1 && now->tm_sec==ss)
- {
- printf("Feeding food on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);
- for(i=0;i
- {
- turnCounter();
-
- }
- for(i=0;i
- {
- turn();
-
- }
- }
- sleep(0.5);
- close(fd);
- }
- set_default_priority();
- return 0;
- }
复制代码
優化完成的程式碼,增加了溫度異常時候關閉繼電器模組的敘述,並且去掉Magic Number,全部用define來定義
2. 但光是這樣還是不夠人性化,需要在Booting後自動啟動所有的程式,因此在/home/lemaker資料夾目錄裡面創建Script,即run.sh,輸入以下啟動指令
- ffserver -f ./ffserver.conf & ffmpeg -r 5 -s 640x480 -f video4linux2 -i /dev/video0 http://localhost:8090/feed1.ffm &
- sleep 10
- sudo /home/lemaker/gpio/motor 12 0 0 0
复制代码
其中sleep 10為必要的,因為ffmpeg啟動會需要些時間跟CPU資源,緩衝時間加入才能讓 motor程式正確啟動
3. Script編寫完畢後,儲存,輸入以下指令來變更執行權限
- sudo chmod +x /home/lemaker/gpio/motor
- sudo chmod +x /home/lemaker/run.sh
复制代码
4. 但這樣還產生一個問題,有使用到sudo指令會需要輸入密碼,必須變更不需要輸入密碼,如下
5. 找到lemaker,在root群組中,變更成使用sudo指令不需要再輸入密碼
- ALL=(ALL) ALL => ALL=(ALL) NOPASSWD: NOPASSWD: ALL
复制代码
修改好後按ctrl+o來儲存,ctrl+x離開
6. 我們要開機時後自動加載攝影頭驅動,輸入以下指令來添加
在最後面增加兩個驅動
這樣開機後會自動加載攝影頭的相關驅動
7. 最後,在系統登入桌面時候自動啟動Script,即run.sh,輸入以下指令來修改
- sudo nano /home/lemaker/.profile
复制代码
在最後面添加這一行
這樣開機登入桌面後就會自動執行這個Script,因為官方已經使用自動登入了,所以登入方面不需修改,以上目錄路徑都採用絕對路徑避免問題
8. 如果還沒設定好無線網路的話,按右上角的NetworkManager圖標進行設定,注意詢問設置Default_keyring時候,不需要設置,否則Wifi會無法自動連線
9. 以上工作都完成以後,就可以實際上機整套來使用了,放置在防水盒子中和使用螺絲釘鎖緊,讓攝影頭剛好可以卡在電線開口上,另一個開口則穿過所有排線,整體圖如下
Fig.1 依照喜好穿孔鎖緊即可,我是各鎖一隻M3螺絲釘就可卡緊,一開口放置攝影頭,一開口拉出所有排線
10. 以下是放置和直接啟用的圖片,小魚缸區
Fig.2 還記得因為攝影頭FPC不夠長,是倒立拍攝,所以放反防水盒即可
Fig.3 餵食器部分,置於小魚缸上
Fig.4 拉出的排線稍作整理,我將ULN2003包上塑膠袋防潮
Fig.5 石英管加熱器和DS18B20溫度感測器完全沉水,右上方可看到攝影頭開口
Fig.6 以虛擬機的VLC播放程式觀看
Fig.7 魚兒水中游
總結:
科技始終來自於人性,本系列文實際展示一套水族箱自動化系統,結合了自動餵食和自動溫控,並且可以透過網路來觀賞水族箱或者魚缸裡的魚兒,系統完整且可靠,也可以再度擴充功能或者加強原型結構,因此實際操作了幾天,達到人們的需求,整個細節已經分散在各篇裡,供小伙伴們學習參考,有問題也可以來詢問
0
评分
-
查看全部评分
|
|
|
|