CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 9804|回复: 5

Cubieboard2防火防盗家居设计

[复制链接]
发表于 2016-6-1 15:27:07 | 显示全部楼层 |阅读模式
最近本人用cubiebaord的开发板做了毕业设计,搞了很多东西,

整个设计的硬件:
Cubiebaord2及DVK扩展板  MQ-2 烟雾传感器 HC-SR501人体热释红外传感器
18B20温度传感器 数码管模块 蜂鸣器 led灯

设计系统的整体

各个模块设计
HC-SR501红外模块

功能:感应到人在检测范围内就会报警,usb摄像头也会对现场进行拍照

代码
  1. #!/bin/bash
  2. videodev="/dev/video0"
  3. redled=4
  4. sensor=5
  5. #second(s) between each check
  6. waitperiod=1
  7. photorepeattimes=3
  8. resolution="800x600"
  9. directory="/tmp"
  10. init_led ()
  11. {
  12.         for i in $redled
  13.         do
  14.                 if [ ! -d /sys/class/gpio/gpio4_pd0 ]
  15.                 then
  16.                         echo $i > /sys/class/gpio/export
  17.                 fi
  18.                         echo "out" > /sys/class/gpio/gpio4_pd0/direction
  19.                         echo 0 > /sys/class/gpio/gpio4_pd0/value
  20.         done
  21. }

  22. init_sensor ()
  23. {
  24.         for i in $sensor
  25.         do
  26.                 if [ ! -d /sys/class/gpio/gpio5_pd1 ]
  27.                 then
  28.                         echo $i > /sys/class/gpio/export
  29.                 fi
  30.                         echo "in" > /sys/class/gpio/gpio5_pd1/direction
  31.         done
  32. }

  33. init_led_sensor ()
  34. {
  35.         init_led
  36.         init_sensor
  37. }

  38. cleanup ()
  39. {
  40.         init_led_sensor
  41.         for i in $redled $sensor
  42.         do
  43.                 if [ -d /sys/class/gpio/gpio$i ]
  44.                 then
  45.                         echo $i > /sys/class/gpio/unexport
  46.                fi
  47.         done
  48.         exit 0
  49. }

  50. capture_photo()
  51. {
  52.         for (( c=0; c<$photorepeattimes; c++ ))
  53.         do
  54.                 filename=$directory/$(date -u +"%d%m%Y_%H%M-%S").jpg
  55.                 fswebcam -d $videodev --timestamp "%Y-%m-%d %H:%M:%S (%Z)" -r $r
  56. esolution $filename
  57.                 sleep 1
  58.         done
  59. }
  60. check_activity ()
  61. {
  62.         sensor_status=`cat /sys/class/gpio/gpio5_pd1/value`
  63.         echo $sensor_status > /sys/class/gpio/gpio4_pd0/value
  64.         if [ "$sensor_status" -eq 1 ]
  65.                 then
  66.                         capture_photo
  67.                fi
  68.         }
  69. init_led_sensor
  70. trap cleanup INT TERM EXIT
  71. while :
  72. do
  73.         check_activity
  74.         sleep $waitperiod
  75. done
复制代码




18b20温度传感器
功能:实时检测当前温度,超过预设的温度就蜂鸣器响来报警
代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <signal.h>
  6. #include <pthread.h>
  7. #include "gpio_lib.h"

  8. #define LSBFIRST 0
  9. #define MSBFIRST 1
  10. #define  DISPBUF_LEN 8

  11. typedef unsigned char byte;

  12. change it in your case.
  13. const char* DS18B20_DEVICE="/sys/bus/w1/devices/28-00000626fc86/w1_slave";

  14. /*
  15. * 74HC595 relative stuff
  16. */

  17. unsigned int latchPin = SUNXI_GPB(11);

  18. unsigned int clockPin = SUNXI_GPB(13);

  19. unsigned int dataPin = SUNXI_GPH(14);

  20. unsigned int zzzzPin = SUNXI_GPG(3);

  21. /*
  22. * Display relative stuff
  23. */

  24. unsigned int digit_tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92,
  25.                         0x82, 0xf8, 0x80, 0x90};

  26. unsigned int digitdot_tab[] = { 0xc0&0x7f, 0xf9&0x7f, 0xa4&0x7f,
  27.                         0xb0&0x7f, 0x99&0x7f, 0x92&0x7f, 0x82&0x7f,
  28.                         0xf8&0x7f, 0x80&0x7f, 0x90&0x7f};
  29. unsigned int symbol_tab[]={ 0xff, 0x7f, 0xbf};
  30. static char dispbuf[DISPBUF_LEN];


  31. /**
  32. * Set Cubieboard's GPIO port-D pin I/O mode: INPUT/OUTPUT
  33. */
  34. void pinMode(unsigned int pin, unsigned int io_mode)
  35. {
  36.     if (SETUP_OK != sunxi_gpio_set_cfgpin(pin, io_mode))
  37.     {
  38.         printf("Failed to config GPIO pin\n");
  39.     }
  40. }

  41. /**
  42. * Set Cubieboard's GPIO port-D pin value(LOW/HIGH)
  43. */
  44. void digitalWrite(int pin, int hl)
  45. {
  46.     if (sunxi_gpio_output(pin, hl))
  47.     {
  48.         printf("Failed to set GPIO pin value\n");
  49.     }
  50. }

  51. void shiftOut(unsigned int dataPin, unsigned int clockPin, int bitOrder, byte val)
  52. {
  53.     byte i;
  54.     for (i = 0; i < 8; i++)
  55.     {
  56.         if (bitOrder == LSBFIRST)
  57.             digitalWrite(dataPin, ! !(val & (1 << i)));
  58.         else
  59.             digitalWrite(dataPin, ! !(val & (1 << (7 - i))));

  60.         digitalWrite(clockPin, HIGH);
  61.         digitalWrite(clockPin, LOW);
  62.     }
  63. }

  64. /**
  65. * Initialize the GPIO & relative pins
  66. */
  67. void init_gpio()
  68. {
  69.     if (SETUP_OK != sunxi_gpio_init())
  70.     {
  71.         printf("Failed to initialize GPIO\n");
  72.     }
  73.     pinMode(latchPin, OUTPUT);
  74.     pinMode(clockPin, OUTPUT);
  75.     pinMode(dataPin, OUTPUT);
  76.     pinMode(zzzzPin, OUTPUT);
  77. }

  78. /**
  79. * Get current temperature from the w1-thermal device
  80. */
  81. void get_temperature(char* tempbuf, int len)
  82. {
  83.     FILE* fp=fopen(DS18B20_DEVICE,"r");
  84.     char* line=NULL;
  85.     char* temperature_tok=NULL;
  86.     int temperature=0;
  87.    
  88.     int n;
  89.     if(!fp){
  90.         fprintf(stderr,"Failed to open device(%s) file!\n", DS18B20_DEVICE);
  91.         return;
  92.     }

  93.     // skip the first line
  94.     getline(&line, &n, fp);
  95.     free(line);
  96.     line=NULL;

  97.    
  98.     getline(&line, &n, fp);
  99.     strtok(line,"=");
  100.     temperature_tok=strtok(NULL,"\n");
  101.    
  102.     strncpy(tempbuf, temperature_tok, len);

  103.     free(line);
  104.     fclose(fp);
  105. }

  106. /**
  107. * Thread of filling the time infomation into display buffer
  108. */
  109. void* time_to_dispbuf()
  110. {
  111.     time_t timep;
  112.     struct tm *p;
  113.     char timebuf[4];
  114.     int interval=1; // in seconds

  115.     while(1){
  116.         // get localtime
  117.         time(&timep);
  118.         p = localtime(&timep);
  119.         sprintf(timebuf, "%02d%02d", p->tm_hour, p->tm_min);

  120.         dispbuf[0]=digit_tab[timebuf[0] - '0'];
  121.         dispbuf[1]=digitdot_tab[timebuf[1] - '0'];
  122.         dispbuf[2]=digit_tab[timebuf[2] - '0'];
  123.         dispbuf[3]=digit_tab[timebuf[3] - '0'];
  124.         dispbuf[4]=symbol_tab[2]; // '-'

  125.         sleep(interval);
  126.     }
  127. }

  128. /**
  129. * Thread of filling the temperature into display buffer
  130. */
  131. void* temp_to_dispbuf()
  132. {
  133.     char tempbuf[3];
  134.     int interval=5;
  135.     float tmp = 0;
  136.    
  137.     while(1){
  138.         get_temperature(tempbuf, sizeof tempbuf);

  139.         dispbuf[5]=digit_tab[tempbuf[0]-'0'];
  140.         dispbuf[6]=digitdot_tab[tempbuf[1]-'0'];
  141.         dispbuf[7]=digit_tab[tempbuf[2]-'0'];
  142.         tmp = (tempbuf[0]-'0')*10 + (tempbuf[1]-'0');

  143.             printf("temperature = %f -------------\n", tmp);
  144.         if (tmp > 28)
  145.             {
  146.                 printf("-----FIRE----FIRE----FIRE----\n");
  147.                 digitalWrite(zzzzPin, LOW);
  148.            }
  149.         else
  150.         {
  151.                 digitalWrite(zzzzPin, HIGH);
  152.         }

  153.         sleep(interval);
  154.     }
  155.    
  156. }

  157. int main(int argc, char **argv)
  158. {
  159.     pthread_t get_time_thread, get_temp_thread;
  160.     void * thread_ret;

  161.     init_gpio();

  162.     pthread_create( &get_time_thread, NULL, time_to_dispbuf, NULL);
  163.     pthread_create( &get_temp_thread, NULL, temp_to_dispbuf, NULL);
  164.   
  165.     while (1)
  166.     {

  167.         int i;
  168.         for(i=0;i<DISPBUF_LEN;i++){
  169.             digitalWrite(latchPin, 0);
  170.             shiftOut(dataPin, clockPin, MSBFIRST, 1<<i);
  171.             shiftOut(dataPin, clockPin, MSBFIRST, dispbuf[i]);
  172.             digitalWrite(latchPin, 1);
  173.             usleep(2000);
  174.         }
  175.         
  176.     }

  177.     pthread_join(get_time_thread,&thread_ret);
  178.     pthread_join(get_temp_thread,&thread_ret);
  179.     return 0;
  180. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

 楼主| 发表于 2016-6-1 15:31:38 | 显示全部楼层
继续下面内容
MQ-2模块

功能:
检测到煤气,天然气,甲烷等气体超过预设的警报值就进行声报警
代码
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <unistd.h>
  4.     #include <sys/types.h>
  5.     #include <sys/stat.h>
  6.     #include <fcntl.h>
  7.     #include <termios.h>
  8.     #include <errno.h>
  9.     #include <sys/time.h>
  10.     #include <string.h>
  11.     #define TRUE 1
  12.     #define FALSE -1
  13.     #define FREZZ_ON "echo 0 > /sys/class/gpio/gpio10_pd17/value"
  14.     #define FREZZ_OFF "echo 1 > /sys/class/gpio/gpio10_pd17/value"
  15.     int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  16.     B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  17.     int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
  18.     38400, 19200, 9600, 4800, 2400, 1200, 300, };
  19.     void set_speed(int fd, int speed)
  20.     {
  21.     int i;
  22.     int status;
  23.     struct termios Opt;
  24.     tcgetattr(fd,&Opt);
  25.     for (i= 0;i<sizeof(speed_arr)/sizeof(int);i++)
  26.     { if(speed == name_arr[i])
  27.     {
  28.     tcflush(fd, TCIOFLUSH);
  29.     cfsetispeed(&Opt, speed_arr[i]);
  30.     cfsetospeed(&Opt, speed_arr[i]);
  31.     status = tcsetattr(fd, TCSANOW, &Opt);
  32.     if(status != 0)
  33.     perror("tcsetattr fd1");
  34.     return;
  35.     } tcflush(fd,TCIOFLUSH);
  36.     }
  37.     }
  38.     int set_Parity(int fd,int databits,int stopbits,int parity)
  39.     {
  40.     struct termios options;
  41.     if( tcgetattr( fd,&options)!= 0)
  42.     {
  43.     perror("SetupSerial 1");
  44.     return(FALSE);
  45.     }
  46.     options.c_cflag &= ~CSIZE;
  47.     switch(databits)
  48.     {
  49.     case 7:
  50.     options.c_cflag |= CS7;
  51.     break;
  52.     case 8:
  53.     options.c_cflag |= CS8;
  54.     break;
  55.     default:
  56.     fprintf(stderr,"Unsupported data size\n");
  57.     return (FALSE);
  58.     }
  59.     switch(parity)
  60.     {
  61.     case 'n':
  62.     case 'N':
  63.     options.c_cflag &= ~PARENB; /* Clear parity enable */
  64.     options.c_iflag &= ~INPCK; /* Enable parity checking */
  65.     options.c_iflag &= ~(ICRNL|IGNCR);
  66.     options.c_lflag &= ~(ICANON );
  67.     break;
  68.     case 'o':
  69.     case 'O':
  70.     options.c_cflag |= (PARODD | PARENB);
  71.     options.c_iflag |= INPCK; /* Disnable parity checking */
  72.     break;
  73.     case 'e':
  74.     case 'E':
  75.     options.c_cflag |= PARENB; /* Enable parity */
  76.     options.c_cflag &= ~PARODD;
  77.     options.c_iflag |= INPCK; /* Disnable parity checking */
  78.     break;
  79.     case 'S':
  80.     case 's': /*as no parity*/
  81.     options.c_cflag &= ~PARENB;
  82.     options.c_cflag &= ~CSTOPB;
  83.     break;
  84.     default:
  85.     fprintf(stderr,"Unsupported parity\n");
  86.     return (FALSE);
  87.     }
  88.     switch(stopbits)
  89.     {
  90.     case 1:
  91.     options.c_cflag &= ~CSTOPB;
  92.     break;
  93.     case 2:
  94.     options.c_cflag |= CSTOPB;
  95.     break;
  96.     default:
  97.     fprintf(stderr,"Unsupported stop bits\n");
  98.     return (FALSE);
  99.     }
  100.     /* Set input parity option */
  101.     if(parity != 'n')
  102.     options.c_iflag |= INPCK;
  103.     options.c_cc[VTIME] = 150; // 15 seconds
  104.     options.c_cc[VMIN] = 0;
  105.     tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
  106.     if(tcsetattr(fd,TCSANOW,&options) != 0)
  107.     {
  108.     perror("SetupSerial 3");
  109.     return (FALSE);
  110.     }
  111.     return (TRUE);
  112.     }
  113.     int main(int argc, char **argv)
  114.     {
  115.     int fd;
  116.     int nread; int nwrite;
  117.     int n=0; int i=0;
  118.     int buffer[200];

  119.     char devname_head[10] = "/dev/";
  120.     char dev_name[20];
  121.     #if 1
  122.     if(argc < 2)
  123.     { printf("Please input './test_uart ttySx'\n");
  124.     exit(1);
  125.     }
  126.     else
  127.     {
  128.     strcpy(dev_name, devname_head); strcat(dev_name, argv[1]
  129.     ); }
  130.     fd = open(dev_name, O_RDWR);
  131.     if(fd < 0)
  132.     {
  133.     perror("error to open /dev/ttySx\n");
  134.     exit(1);
  135.     }
  136.     #endif
  137.     if (fd > 0)
  138.     {
  139.     set_speed(fd,9600);
  140.     }
  141.     else
  142.     {
  143.     printf("Can't Open Serial Port!\n");
  144.     exit(0);
  145.     }
  146.     if (set_Parity(fd,8,1,'N') == FALSE)
  147.     {
  148.     printf("Set Parity Error\n");
  149.     exit(1);
  150.     }
  151.     printf("\nWelcome to gps_test\n\n");
  152.     system(FREZZ_OFF);
  153.     memset(buffer,0,sizeof(buffer));
  154.     while(1)
  155.     {
  156.     nread = read(fd,&buffer,200);

  157.     if(nread < 0)
  158.     {
  159.     printf("read error\n");
  160.     }
  161.     int a=atoi(buffer);
  162.     printf("%d\n",a);
  163.     if(a > 47)
  164.     {
  165.     system(FREZZ_ON);

  166.     }
  167.     else{
  168.     system(FREZZ_OFF);
  169.     }

  170.     memset(buffer,0,sizeof(buffer));

  171.     }
  172.     }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-1 15:48:24 | 显示全部楼层
本帖最后由 Reachy 于 2016-6-1 15:49 编辑

18b20温度传感器是w1总线的传感器,需要在底层驱动开启编译成模块然后加载到开发板就可以用了
  1. make  ARCH=arm  menuconfig
复制代码



选好之后退出,进入1-wire slaves ---> 将Thermal family implementation选上

最后保存退出

然后在Ubuntu终端执行下面指令
  1. $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 uImage
复制代码
若编译内核没有报错则进入需要编译的驱动目录
  1. cd /driver/spi
复制代码
编译没有出错则就在/lib/modules/3.13.0-32-genric/kernel/drivers下有模块生成 W1

在w1下就有驱动模块了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-1 15:54:46 | 显示全部楼层
摄像头除了拍照,如果搭建了局部网络还可以通过手机进行网络访问usb摄像头,了解现场的情况
回复 支持 反对

使用道具 举报

发表于 2016-6-2 14:39:07 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

发表于 2016-7-26 10:40:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-3-29 17:55 , Processed in 0.033079 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部