发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[香蕉派作品] 【LeMaker Guitar试用体验】居家水族箱 (4) 和結語
2016-3-16 00:37:21  3122
分享
本帖最后由 MOPPLAYER 于 2016-3-16 01:51 编辑

前言:
經過三篇的分析和介紹,本篇將實際整合出一套系統並且實際使用這套系統,目前已經啟用中,並且附上大量的圖片供小伙伴們參考,並結束本項目,做個總結

準備:
0. 前三篇所設計好的原型        
1. 延長線或電源插座,會使用到兩孔
2. 防水盒,放置所有板子
3. 螺絲起子和M3螺絲釘

之前文章的匯總:


【LeMaker Guitar试用体验】安裝系統和檢測
【LeMaker Guitar试用体验】居家水族箱 (1)
【LeMaker Guitar试用体验】居家水族箱 (2)
【LeMaker Guitar试用体验】居家水族箱 (3)

實作:
1. 將第二篇的程式碼加以優化,主要是增加溫度取值異常時候要自動關閉繼電器模組,完整程式碼如下:

  1. <span style="background-color: White;">#include <stdio.h>
  2. #include "gpio.h"
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #define IN1 131
  6. #define IN2 130
  7. #define IN3 50
  8. #define IN4 64
  9. #define DS18b20_PATH "/sys/bus/w1/devices/28-021564c894ff/w1_slave"
  10. #define RELAY 90
  11. #define TEMP_HIGH 28
  12. #define TEMP_LOW 24
  13. #define SPEED 1000
  14. #define DEGREE180 256

  15. void turnCounter()
  16. {
  17.         s500_mmio_set_high(IN1);
  18.         s500_mmio_set_low(IN2);
  19.         s500_mmio_set_low(IN3);
  20.         s500_mmio_set_low(IN4);
  21.         usleep(SPEED);

  22.         s500_mmio_set_high(IN1);
  23.         s500_mmio_set_high(IN2);
  24.         s500_mmio_set_low(IN3);
  25.         s500_mmio_set_low(IN4);
  26.         usleep(SPEED);

  27.         s500_mmio_set_low(IN1);
  28.         s500_mmio_set_high(IN2);
  29.         s500_mmio_set_low(IN3);
  30.         s500_mmio_set_low(IN4);
  31.         usleep(SPEED);

  32.         s500_mmio_set_low(IN1);
  33.         s500_mmio_set_high(IN2);
  34.         s500_mmio_set_high(IN3);
  35.         s500_mmio_set_low(IN4);
  36.         usleep(SPEED);

  37.         s500_mmio_set_low(IN1);
  38.         s500_mmio_set_low(IN2);
  39.         s500_mmio_set_high(IN3);
  40.         s500_mmio_set_low(IN4);
  41.         usleep(SPEED);

  42.         s500_mmio_set_low(IN1);
  43.         s500_mmio_set_low(IN2);
  44.         s500_mmio_set_high(IN3);
  45.         s500_mmio_set_high(IN4);
  46.         usleep(SPEED);

  47.         s500_mmio_set_low(IN1);
  48.         s500_mmio_set_low(IN2);
  49.         s500_mmio_set_low(IN3);
  50.         s500_mmio_set_high(IN4);
  51.         usleep(SPEED);

  52.         s500_mmio_set_high(IN1);
  53.         s500_mmio_set_low(IN2);
  54.         s500_mmio_set_low(IN3);
  55.         s500_mmio_set_high(IN4);
  56.         usleep(SPEED);
  57. }

  58. void turn()
  59. {
  60.         s500_mmio_set_high(IN4);
  61.         s500_mmio_set_low(IN3);
  62.         s500_mmio_set_low(IN2);
  63.         s500_mmio_set_low(IN1);
  64.         usleep(SPEED);

  65.         s500_mmio_set_high(IN4);
  66.         s500_mmio_set_high(IN3);
  67.         s500_mmio_set_low(IN2);
  68.         s500_mmio_set_low(IN1);
  69.         usleep(SPEED);

  70.         s500_mmio_set_low(IN4);
  71.         s500_mmio_set_high(IN3);
  72.         s500_mmio_set_low(IN2);
  73.         s500_mmio_set_low(IN1);
  74.         usleep(SPEED);

  75.         s500_mmio_set_low(IN4);
  76.         s500_mmio_set_high(IN3);
  77.         s500_mmio_set_high(IN2);
  78.         s500_mmio_set_low(IN1);
  79.         usleep(SPEED);

  80.         s500_mmio_set_low(IN4);
  81.         s500_mmio_set_low(IN3);
  82.         s500_mmio_set_high(IN2);
  83.         s500_mmio_set_low(IN1);
  84.         usleep(SPEED);

  85.         s500_mmio_set_low(IN4);
  86.         s500_mmio_set_low(IN3);
  87.         s500_mmio_set_high(IN2);
  88.         s500_mmio_set_high(IN1);
  89.         usleep(SPEED);

  90.         s500_mmio_set_low(IN4);
  91.         s500_mmio_set_low(IN3);
  92.         s500_mmio_set_low(IN2);
  93.         s500_mmio_set_high(IN1);
  94.         usleep(SPEED);

  95.         s500_mmio_set_high(IN4);
  96.         s500_mmio_set_low(IN3);
  97.         s500_mmio_set_low(IN2);
  98.         s500_mmio_set_high(IN1);
  99.         usleep(SPEED);
  100. }

  101. int main(int argc, char *argv[])
  102. {
  103.         int i;
  104.         time_t t;
  105.         struct tm* now;
  106.         int ss=atoi(argv[3]);
  107.         int mm=atoi(argv[2]);
  108.         int hh=atoi(argv[1]);
  109.         int test=atoi(argv[4]);
  110.         int fd =0;
  111.         char crc_buf[4]={};
  112.         char temp_buf[10]={};
  113.         float temp;

  114.         IF (s500_mmio_init() < 0) {
  115.                     printf("error open mem!n");
  116.           }

  117.         set_max_priority();

  118.         s500_mmio_set_output(IN1);
  119.         s500_mmio_set_output(IN2);
  120.         s500_mmio_set_output(IN3);
  121.         s500_mmio_set_output(IN4);
  122.         
  123.         s500_mmio_set_output(RELAY);

  124.         time(&t);
  125.         now = localtime(&t);
  126.         
  127.         printf("System starting on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);
  128.         printf("Setting time on %dn", ss);
  129.         
  130.         while(1)
  131.         {
  132.                 fd= open(DS18B20_PATH, O_RDONLY);
  133.                 if(fd < 0)
  134.                 {
  135.                         perror("w1_device:");
  136.                         s500_mmio_set_low(RELAY);
  137.                 }
  138.                 else
  139.                 {
  140.                         pread(fd,crc_buf,sizeof(crc_buf),36);

  141.                
  142.                         if(strncmp(crc_buf,"YES",3)!=0)
  143.                         {
  144.                                 printf("CRC error, so drop it!n");
  145.                                 s500_mmio_set_low(RELAY);
  146.                         }
  147.                         else
  148.                         {
  149.                                 pread(fd,temp_buf,sizeof(temp_buf),69);

  150.                                 temp=(float)atoi(temp_buf)/1000;
  151.                                 printf("Temp= %fn",temp);
  152.                
  153.                                 if(temp > TEMP_HIGH)
  154.                                         s500_mmio_set_low(RELAY);
  155.                                 else if (temp < TEMP_LOW)
  156.                                         s500_mmio_set_high(RELAY);
  157.                         }

  158.                 }

  159.                 time(&t);
  160.                 now = localtime(&t);

  161.                 if(test==0 && now->tm_sec==ss && now->tm_min==mm && now->tm_hour==hh)
  162.                 {
  163.                         printf("Feeding food on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);

  164.                         for(i=0;i<DEGREE180;i++)
  165.                         {        
  166.                                 turnCounter();
  167.                                 
  168.                         }

  169.                         for(i=0;i<DEGREE180;i++)
  170.                         {
  171.                                 turn();        
  172.                                        
  173.                         }
  174.                 }
  175.                 else if(test==1 && now->tm_sec==ss)
  176.                 {
  177.                         printf("Feeding food on %d : %d : %dn",now->tm_hour,now->tm_min,now->tm_sec);

  178.                         for(i=0;i<DEGREE180;i++)
  179.                         {        
  180.                                 turnCounter();
  181.                                 
  182.                         }

  183.                         for(i=0;i<DEGREE180;i++)
  184.                         {
  185.                                 turn();        
  186.                                        
  187.                         }
  188.                 }
  189.                 sleep(0.5);
  190.                 close(fd);        
  191.         }
  192.         set_default_priority();
  193.         return 0;        
  194. }</span>
复制代码
優化完成的程式碼,增加了溫度異常時候關閉繼電器模組的敘述,並且去掉Magic Number,全部用define來定義

2. 但光是這樣還是不夠人性化,需要在Booting後自動啟動所有的程式,因此在/home/lemaker資料夾目錄裡面創建Script,即run.sh,輸入以下啟動指令
  1. <span style="background-color: White;">ffserver -f ./ffserver.conf & ffmpeg -r 5 -s 640x480 -f video4linux2 -i /dev/video0 http://localhost:8090/feed1.ffm &
  2. sleep 10
  3. sudo /home/lemaker/gpio/motor 12 0 0 0</span>
复制代码
其中sleep 10為必要的,因為ffmpeg啟動會需要些時間跟CPU資源,緩衝時間加入才能讓motor程式正確啟動

3. Script編寫完畢後,儲存,輸入以下指令來變更執行權限
  1. <span style="background-color: White;">sudo chmod +x /home/lemaker/gpio/motor
  2. sudo chmod +x /home/lemaker/run.sh</span>
复制代码

4. 但這樣還產生一個問題,有使用到sudo指令會需要輸入密碼,必須變更不需要輸入密碼,如下
  1. <span style="background-color: White;">sudo nano /etc/sudoers</span>
复制代码

5. 找到lemaker,在root群組中,變更成使用sudo指令不需要再輸入密碼
  1. <span style="background-color: White;">ALL=(ALL) ALL => ALL=(ALL) NOPASSWD: NOPASSWD: ALL</span>
复制代码
修改好後按ctrl+o來儲存,ctrl+x離開

6. 我們要開機時後自動加載攝影頭驅動,輸入以下指令來添加
  1. <span style="background-color: White;">sudo nano /etc/modules</span>
复制代码
在最後面增加兩個驅動
  1. <span style="background-color: White;">owl_camera
  2. ov5640</span>
复制代码
這樣開機後會自動加載攝影頭的相關驅動

7. 最後,在系統登入桌面時候自動啟動Script,即run.sh,輸入以下指令來修改
  1. <span style="background-color: White;">sudo nano /home/lemaker/.profile</span>
复制代码
在最後面添加這一行
  1. <span style="background-color: White;">/home/lemaker/run.sh</span>
复制代码
這樣開機登入桌面後就會自動執行這個Script,因為官方已經使用自動登入了,所以登入方面不需修改,以上目錄路徑都採用絕對路徑避免問題

8. 如果還沒設定好無線網路的話,按右上角的NetworkManager圖標進行設定,注意詢問設置Default_keyring時候,不需要設置,否則Wifi會無法自動連線

9. 以上工作都完成以後,就可以實際上機整套來使用了,放置在防水盒子中和使用螺絲釘鎖緊,讓攝影頭剛好可以卡在電線開口上,另一個開口則穿過所有排線,整體圖如下

IMAG2031.jpg
Fig.1 依照喜好穿孔鎖緊即可,我是各鎖一隻M3螺絲釘就可卡緊,一開口放置攝影頭,一開口拉出所有排線

10. 以下是放置和直接啟用的圖片,小魚缸區
IMAG2034.jpg
Fig.2 還記得因為攝影頭FPC不夠長,是倒立拍攝,所以放反防水盒即可

IMAG2035.jpg
Fig.3 餵食器部分,置於小魚缸上

IMAG2036.jpg
Fig.4 拉出的排線稍作整理,我將ULN2003包上塑膠袋防潮

IMAG2037.jpg
Fig.5 石英管加熱器和DS18B20溫度感測器完全沉水,右上方可看到攝影頭開口

496.PNG
Fig.6 以虛擬機的VLC播放程式觀看

497.PNG
Fig.7 魚兒水中游

總結:
科技始終來自於人性,本系列文實際展示一套水族箱自動化系統,結合了自動餵食和自動溫控,並且可以透過網路來觀賞水族箱或者魚缸裡的魚兒,系統完整且可靠,也可以再度擴充功能或者加強原型結構,因此實際操作了幾天,達到人們的需求,整個細節已經分散在各篇裡,供小伙伴們學習參考,有問題也可以來詢問
0

评分

参与人数 2积分 +15 收起 理由
960596356 + 5 原创技术先锋,加分鼓励!
可乐丸子 + 10 原创技术先锋,加分鼓励!

查看全部评分

2016-3-16 00:37:21   评论 分享淘帖
5 个讨论
太赞了,
2016-3-16 09:28:24 评论

举报

楼主大赞
2016-3-18 10:31:09 评论

举报

很棒的作品顶一个!
2016-5-7 18:21:26 评论

举报

感谢楼主分享,写的非常好!大赞!
2016-5-12 14:58:19 评论

举报

謝謝大家,主要提供小伙伴們一些創意跟構思
並且去實踐它,做出實用的東西才是學習的目的
2016-5-19 09:53:30 评论

举报

只有小组成员才能发言,加入小组>>

11个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表