基于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.通过此次试用自己更加清晰的理解了GPIO,EEPROM,RTC等功能;
2.对于三线SPI模式的OLED设备有了一定的了解,美中不足的是4线SPI模式和IIC模式的OLED模块尚未实现功能,后面有时间继续努力。
3.按照计划自己还会测试另外一个RTC模块,后面时间一定将这个功能补上。
测试视频见下面的链接:
http://v.youku.com/v_show/id_XMTg3OTY1Nzk2NA==.html
雾霾,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驱动中进行。
- /*
- * SPI testing utility (using spidev driver)
- *
- * Copyright (c) 2007 MontaVista Software, Inc.
- * Copyright (c) 2007 Anton Vorontsov
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License.
- *
- * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
- */
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include /*文件控制定义*/
- #include /*PPSIX 终端控制定义*/
- #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
- static void pabort(const char *s)
- {
- perror(s);
- abort();
- }
- #define UART_BAND_RATE 115200
- static const char *device = "/dev/oeld32766.0";
- static uint8_t mode;
- static uint8_t bits = 8;
- static uint32_t speed = 500000;
- static uint16_t delay;
- struct ss1306_data {
- int x1;
- int y1;
- int str1_len;
- char str1[20];
- int x2;
- int y2;
- char str2[20];
- int str2_len;
- int x3;
- int y3;
- char str3[20];
- int str3_len;
- };
- #if 1
- static void transfer1(int fd, int x1, int y1, char *str1, int str1_len,
- int x2, int y2, char *str2, int str2_len,
- int x3, int y3, char *str3, int str3_len)
- {
- int ret;
- //char str1[] = "1234567890abcdefg";
- //char str2[] = "asdcfgtrerrefd";
- struct ss1306_data tx;
- struct ss1306_data *ptx;
- ptx = &tx;
- tx.x1 = 0;
- tx.y1 = 0;
- memcpy(tx.str1, str1, str1_len);
- tx.x2 = 0;
- tx.y2 = 16;
- memcpy(tx.str2, str2, str2_len);
- tx.x3 = 0;
- tx.y3 = 32;
- memcpy(tx.str3, str3, str3_len);
- // printf("==str1=%s, str2=%s str3=%s\n", str1, str2, str3);
- ret = write(fd, &tx, sizeof(struct ss1306_data));
- if(ret > 0)
- {
- printf("=2=strlen(str1)=%d, sizeof(struct ss1306_data)=%d \n", str1_len, sizeof(struct ss1306_data));
- }
- else
- {
- printf("show sucess!\n");
- // printf("=3=strlen(str1)=%d, sizeof(struct ss1306_data)=%d \n", str1_len, sizeof(struct ss1306_data));
- }
- }
- #else
- static void transfer(int fd)
- {
- int ret;
- uint8_t tx[] = {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
- 0xF0, 0x0D,
- };
- uint8_t rx[ARRAY_SIZE(tx)] = {0, };
- struct spi_ioc_transfer tr = {
- .tx_buf = (unsigned long)tx,
- .rx_buf = (unsigned long)rx,
- .len = ARRAY_SIZE(tx),
- .delay_usecs = delay,
- .speed_hz = speed,
- .bits_per_word = bits,
- };
- ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
- if (ret open=%d\n",fd);
- return fd;
- }
- /*******************************************************************
- * 名称: UART0_Close
- * 功能: 关闭串口并返回串口设备文件描述
- * 入口参数: fd :文件描述符 port :串口号(ttyS0,ttyS1,ttyS2)
- * 出口参数: void
- *******************************************************************/
-
- void UART0_Close(int fd)
- {
- close(fd);
- }
-
- /*******************************************************************
- * 名称: UART0_Set
- * 功能: 设置串口数据位,停止位和效验位
- * 入口参数: fd 串口文件描述符
- * speed 串口速度
- * flow_ctrl 数据流控制
- * databits 数据位 取值为 7 或者8
- * stopbits 停止位 取值为 1 或者2
- * parity 效验类型 取值为N,E,O,,S
- *出口参数: 正确返回为1,错误返回为0
- *******************************************************************/
- int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
- {
-
- int i;
- int status;
- int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};
- int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300};
-
- struct termios options;
-
- /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
- */
- if ( tcgetattr( fd,&options) != 0)
- {
- perror("SetupSerial 1");
- return(FALSE);
- }
-
- //设置串口输入波特率和输出波特率
- for ( i= 0; i 0)
- {
- if (first_start)
- {
- first_start = 0;
- }
- memcpy(&uart_rcv_buf[uart_wr_ptr], uart_once_buf, len);
- uart_wr_ptr += len;
- }
- }
- else
- {
- // printf("time out!\n");
- if (first_start == 0)
- {
- if (len > 0)
- {
- if (uart_wr_ptr > 0)
- {
- printf("uart_rcv_buf=%s uart_wr_ptr=%d\n", uart_rcv_buf, uart_wr_ptr);
- if (uart_wr_ptr gps_data, uart_rcv_buf, uart_wr_ptr);
- char str1[16] = {0};
- char str2[16] = {0};
- char str3[64] = {0};
- if(uart_wr_ptr > 16)
- {
- memcpy(str1, uart_rcv_buf, 16);
- if(uart_wr_ptr > 16 + 16)
- memcpy(str2, uart_rcv_buf+16, 16);
- if(uart_wr_ptr > 16 * 2)
- {
- int n3 = 0;
- if(uart_wr_ptr >= 16 * 3)
- {
- n3 = 16;
- }
- else
- {
- n3 = uart_wr_ptr - 32;
- }
- for(i = 0; i 256);
- printk("=2=oeld_init\n");
- status = register_chrdev(oeld_MAJOR, "spi", &oeld_fops);
- if (status bufsiz)
- return -EMSGSIZE;
- // printk("=2=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);
- oeld = filp->private_data;
- mutex_lock(&oeld->buf_lock);
- missing = copy_from_user(oeld->buffer, buf, count);
- if (missing == 0) {
- #if 0
- status = oeld_sync_write(oeld, count);
- #else
- // printk("=211=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);
- pss1306_data = (struct ss1306_data *)oeld->buffer;
- status = ssd1306_showString(oeld->spi, pss1306_data);
- // printk("=212=oeld_write count=%d, status=%d\n", count, status);
- #endif
- } else
- {
- printk("=22=oeld_write count=%d, bufsiz=%d\n", count, bufsiz);
- status = -EFAULT;
- }
- mutex_unlock(&oeld->buf_lock);
- return status;
- }
项目总结:
1.通过此次试用自己更加清晰的理解了GPIO,EEPROM,RTC等功能;
2.对于三线SPI模式的OLED设备有了一定的了解,美中不足的是4线SPI模式和IIC模式的OLED模块尚未实现功能,后面有时间继续努力。
3.按照计划自己还会测试另外一个RTC模块,后面时间一定将这个功能补上。
测试视频见下面的链接:
http://v.youku.com/v_show/id_XMTg3OTY1Nzk2NA==.html
学习学习 多谢小编分享
试用礼品已经收到多谢啦!不过不如米尔开发板好,唉!