微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 基于Ricoboard开发板实现PM2.5检测系统

基于Ricoboard开发板实现PM2.5检测系统

时间:10-02 整理:3721RD 点击:
项目概述:
雾霾,PM2.5就像汽车,手机其他新生事物一样慢慢走入人们的生活之中,尤其是北方生活的人们。不过我们普通人只能买点口罩找点心里安慰,也许带的口罩也未必真的能够防住PM2.5。从技术人员的角度出发,自己就以实现PM2.5检测系统为主题申请参与米尔科技Ricoboard开发板试用活动。当然也在Ricoboard开发板上测试了其他很多有用的功能,比如EEPROM,HDMI,RTC,OLED和USB转串口等功能。
PM2.5系统测试:
连接好硬件,系统启动后加载模块到系统,运行应用程序spidev_test,将从arduino开发板上读到的PM2.5的数据发送到OLED上显示,视频里面我们可以看到PM2.5测试数据在不断刷新显示。
硬件准备:
Ricoboard开发板,OLED显示模块,PM2.5检测设备(Dust Sensor),USB转串口线和arduino开发板。





OLED和USB转串口接线方式见:
http://bbs.elecfans.com/forum.ph ... =1101412&extra=和http://bbs.elecfans.com/forum.ph ... =1102312&extra=
软件实现:
1.OLED显示设备功能实现:主要参考http://bbs.elecfans.com/forum.ph ... =1101412&extra=,
2.PM2.5检测设备(Dust Sensor)功能实现,其主要实现逻辑是在arduino开发板上,自己并没有将其连接到Ricoboard开发板上,是特意为了尝试一下Ricoboard这类arm开发板是否可以与arduino这类开发板整合起来,通过实验发现两者之间可以很好的结合在一起。USB转串口的实现参考:
http://bbs.elecfans.com/forum.ph ... =1102312&extra=
3.应用程序功能实现:1)主要是USB转串口信息的读取;2)是如何访问OLED驱动的设备节点,如何将PM2.5的数据发送到OLED驱动中进行。

  1. /*
  2. * SPI testing utility (using spidev driver)
  3. *
  4. * Copyright (c) 2007  MontaVista Software, Inc.
  5. * Copyright (c) 2007  Anton Vorontsov
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License.
  10. *
  11. * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
  12. */

  13. #include
  14. #include
  15. #include
  16. #include
  17. #include
  18. #include
  19. #include
  20. #include
  21. #include
  22. #include       /*文件控制定义*/
  23. #include     /*PPSIX 终端控制定义*/

  24. #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

  25. static void pabort(const char *s)
  26. {
  27.         perror(s);
  28.         abort();
  29. }
  30. #define UART_BAND_RATE 115200

  31. static const char *device = "/dev/oeld32766.0";
  32. static uint8_t mode;
  33. static uint8_t bits = 8;
  34. static uint32_t speed = 500000;
  35. static uint16_t delay;
  36. struct ss1306_data {
  37.         int x1;
  38.         int y1;
  39.         int str1_len;
  40.         char str1[20];
  41.         int x2;
  42.         int y2;
  43.         char str2[20];
  44.         int str2_len;
  45.         int x3;
  46.         int y3;
  47.         char str3[20];
  48.         int str3_len;
  49. };
  50. #if 1
  51. static void transfer1(int fd, int x1, int y1, char *str1, int str1_len,
  52.                                                                                                                         int x2, int y2, char *str2, int str2_len,
  53.                                                                                                                         int x3, int y3, char *str3, int str3_len)
  54. {
  55.         int ret;
  56.         //char str1[] = "1234567890abcdefg";
  57.         //char str2[] = "asdcfgtrerrefd";
  58.         struct ss1306_data tx;
  59.         struct ss1306_data *ptx;
  60.         ptx = &tx;
  61.         tx.x1 = 0;
  62.         tx.y1 = 0;
  63.         memcpy(tx.str1, str1, str1_len);
  64.         tx.x2 = 0;
  65.         tx.y2 = 16;
  66.         memcpy(tx.str2, str2, str2_len);
  67.         tx.x3 = 0;
  68.         tx.y3 = 32;
  69.         memcpy(tx.str3, str3, str3_len);
  70. //        printf("==str1=%s, str2=%s str3=%s\n", str1, str2, str3);
  71.         ret = write(fd, &tx, sizeof(struct ss1306_data));
  72.         if(ret > 0)
  73.         {
  74.         printf("=2=strlen(str1)=%d, sizeof(struct ss1306_data)=%d \n", str1_len, sizeof(struct ss1306_data));
  75.         }
  76.         else
  77.                 {
  78.                         printf("show sucess!\n");
  79.                         //        printf("=3=strlen(str1)=%d, sizeof(struct ss1306_data)=%d \n", str1_len, sizeof(struct ss1306_data));

  80.                 }
  81. }
  82. #else
  83. static void transfer(int fd)
  84. {
  85.         int ret;
  86.         uint8_t tx[] = {
  87.                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  88.                 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
  89.                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  90.                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  91.                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  92.                 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
  93.                 0xF0, 0x0D,
  94.         };
  95.         uint8_t rx[ARRAY_SIZE(tx)] = {0, };
  96.         struct spi_ioc_transfer tr = {
  97.                 .tx_buf = (unsigned long)tx,
  98.                 .rx_buf = (unsigned long)rx,
  99.                 .len = ARRAY_SIZE(tx),
  100.                 .delay_usecs = delay,
  101.                 .speed_hz = speed,
  102.                 .bits_per_word = bits,
  103.         };

  104.         ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
  105.         if (ret open=%d\n",fd);
  106.   return fd;
  107. }
  108. /*******************************************************************
  109. * 名称:                UART0_Close
  110. * 功能:                关闭串口并返回串口设备文件描述
  111. * 入口参数:        fd    :文件描述符     port :串口号(ttyS0,ttyS1,ttyS2)
  112. * 出口参数:        void
  113. *******************************************************************/

  114. void UART0_Close(int fd)
  115. {
  116.     close(fd);
  117. }

  118. /*******************************************************************
  119. * 名称:                UART0_Set
  120. * 功能:                设置串口数据位,停止位和效验位
  121. * 入口参数:        fd        串口文件描述符
  122. *                              speed     串口速度
  123. *                              flow_ctrl   数据流控制
  124. *                           databits   数据位   取值为 7 或者8
  125. *                           stopbits   停止位   取值为 1 或者2
  126. *                           parity     效验类型 取值为N,E,O,,S
  127. *出口参数:          正确返回为1,错误返回为0
  128. *******************************************************************/
  129. int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
  130. {
  131.    
  132.      int   i;
  133.      int   status;
  134.      int   speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};
  135.      int   name_arr[] = {115200, 57600, 38400, 19200,  9600,  4800,  2400,  1200,  300};
  136.          
  137.     struct termios options;
  138.    
  139.     /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
  140.     */
  141.     if  ( tcgetattr( fd,&options)  !=  0)
  142.        {
  143.           perror("SetupSerial 1");   
  144.           return(FALSE);
  145.        }
  146.   
  147.     //设置串口输入波特率和输出波特率
  148.     for ( i= 0;  i 0)
  149.             {
  150.                 if (first_start)
  151.                 {
  152.                     first_start = 0;
  153.                 }
  154.                 memcpy(&uart_rcv_buf[uart_wr_ptr], uart_once_buf, len);
  155.                 uart_wr_ptr += len;               
  156.             }
  157.         }
  158.         else
  159.         {
  160. //            printf("time out!\n");
  161.             if (first_start == 0)
  162.             {
  163.                 if (len > 0)
  164.                 {
  165.                     if (uart_wr_ptr > 0)
  166.                     {                        
  167.                         printf("uart_rcv_buf=%s uart_wr_ptr=%d\n", uart_rcv_buf, uart_wr_ptr);      
  168.                                 if (uart_wr_ptr gps_data, uart_rcv_buf, uart_wr_ptr);  
  169.                         char str1[16] = {0};
  170.                         char str2[16] = {0};
  171.                         char str3[64] = {0};
  172.                         if(uart_wr_ptr > 16)
  173.                         {
  174.                                 memcpy(str1, uart_rcv_buf, 16);
  175.                                 if(uart_wr_ptr > 16 + 16)
  176.                                         memcpy(str2, uart_rcv_buf+16, 16);
  177.                                 if(uart_wr_ptr > 16 * 2)
  178.                                 {
  179.                                         int n3 = 0;
  180.                                         if(uart_wr_ptr >= 16 * 3)
  181.                                         {
  182.                                                 n3 = 16;
  183.                                         }
  184.                                         else
  185.                                         {
  186.                                                 n3 = uart_wr_ptr - 32;
  187.                                         }
  188.                                    for(i = 0; i 256);
  189.         printk("=2=oeld_init\n");
  190.         status = register_chrdev(oeld_MAJOR, "spi", &oeld_fops);
  191.         if (status bufsiz)
  192.                 return -EMSGSIZE;
  193. //        printk("=2=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);

  194.         oeld = filp->private_data;

  195.         mutex_lock(&oeld->buf_lock);
  196.         missing = copy_from_user(oeld->buffer, buf, count);
  197.         if (missing == 0) {
  198.         #if 0
  199.                 status = oeld_sync_write(oeld, count);
  200.         #else
  201.         //        printk("=211=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);
  202.                 pss1306_data = (struct ss1306_data *)oeld->buffer;
  203.                 status = ssd1306_showString(oeld->spi, pss1306_data);
  204.         //        printk("=212=oeld_write count=%d, status=%d\n", count, status);
  205.         #endif
  206.         } else
  207.         {
  208.                         printk("=22=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);
  209.                 status = -EFAULT;
  210.         }
  211.         mutex_unlock(&oeld->buf_lock);

  212.         return status;
  213. }

复制代码


项目总结:
1.通过此次试用自己更加清晰的理解了GPIO,EEPROM,RTC等功能;
2.对于三线SPI模式的OLED设备有了一定的了解,美中不足的是4线SPI模式和IIC模式的OLED模块尚未实现功能,后面有时间继续努力。
3.按照计划自己还会测试另外一个RTC模块,后面时间一定将这个功能补上。
测试视频见下面的链接:
http://v.youku.com/v_show/id_XMTg3OTY1Nzk2NA==.html

学习学习  多谢小编分享

试用礼品已经收到多谢啦!不过不如米尔开发板好,唉!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top