利用Linux系统和iTop开发板设计一个根据光强度控制灯光照明的系统,要求实现以下功能:
1.能利用光敏电阻的阻值变化检测是否有光照,有光照情况下红灯和蓝灯均灭,在无光照情况下蓝灯、红灯均变亮;
2.通过ADC读取光敏电阻的阻值变化,转换得出数值,再加以判断光照强度,控制灯的亮灭;
3.通过连接的zigbee模块与其他zigbee模块进行串口通信,将ADC所得值传至其他zigbee模块上,再由串口在PC端打印出来。
需要更改
#include <stdio.h>
#include <stdlib.h>//atoi,exit
#include <fcntl.h>//open
#include <errno.h>//没用到
#include <unistd.h>//read
#include <sys/types.h>//open
#include <sys/stat.h>//open
#include <string.h>//memset
#include <stdint.h>//没用到
#include <termios.h>//没用到
//#include <android/log.h>
//#include <sys/ioctl.h>
int fd_adc,fd_led;
int set_opt(int,int,int,char,int);//声明函数
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);
void uart(int X,int Y,int Z)
{
char *filepath_uart3="/dev/ttySAC3";//绝对路径还是相对路径?--./当前路径=相对路径
int i,fd_uart3,ret_uart3;
char read_data_buf[100];
ssize_t read_count,write_count;
//char *write_data_buf="please input:\n";//使用英文字符,不要中文
//您想发送二进制数据或一串十六进制字符?
//对于选项一,您可以使用: write(fd,somebuffer,len); ,其中一些缓冲区是指向任何一组字节(包括整数等)的指针。
//对于选项二,首先使用将数据转换为十六进制字符串, sprintf 与%02X 作为格式字符串,然后继续写入数据到港口。
//char (check_ip_buf)[8]={'0xfe','0x05','0x90','0x21','0x00','0x00','0x01','0xff'};
char check_ip_buf[11]={0xfe,0x08,0x91,0x90, 0xBE,0x0C, 0x03, 0x23,0x13,0x33,0xff};
check_ip_buf[7]=X;
check_ip_buf[8]=Y;
check_ip_buf[9]=Z;
/打开文件--open--正确返回文件句柄>0,错误返回-1/
//int open(const char *pathname, int flags);
fd_uart3=open(filepath_uart3, O_RDWR); //fd_uart3文件句柄
if(fd_uart3<0)
printf("open uart3 error\n");
else
printf("open uart3 ok\n");
/******串口3初始化设置参数--正确返回0,错误返回-1*******/
ret_uart3=set_opt(fd_uart3,115200,8,'N', 1); //文件句柄 波特率 数据位 奇偶校验位 停止位
if(ret_uart3<0)
printf("init uart3 error\n");
if(write_count<=0)
printf("write uart3 error\n");
write_count=write(fd_uart3,check_ip_buf,11);
close(fd_uart3);
}
//串口初始化设置参数--正确返回0,错误返回-1
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
//set_opt(fd, 115200, 8, 'N', 1);
//文件句柄 波特率 数据位 奇偶校验位 停止位
{
struct termios newtio,oldtio;
// #define NCCS 19
// struct termios {
// unsigned short c_iflag; /* input mode flags */
// unsigned short c_oflag; /* output mode flags */
// unsigned short c_cflag; /* control mode flags */
// unsigned short c_lflag; /* local mode flags */
// unsigned char c_line; /* line discipline */
// unsigned char c_cc[NCCS]; /* control characters */
// };
//读旧的结构体,terminal control get attribute ,正确返回0
if ( tcgetattr( fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return -1;
}
//给新的结构体赋值c_cflag--除了波特率
//#define CLOCAL 0004000
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'O'://奇校验
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E'://偶校验
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
newtio.c_iflag &= ~(INLCR | ICRNL); //不要回车和换行转换
newtio.c_iflag &= ~(IXON | IXOFF | IXANY); //不要软件流控制
newtio.c_oflag &= ~OPOST;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //原始模式
break;
}
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
newtio.c_cflag = newtio.c_cflag & (~CSTOPB);//CSTOPB 0000100
else if ( nStop == 2 ) //~CSTOPB FFFFEFF
newtio.c_cflag |= CSTOPB;//1111 1111 1111 1111 1110 1111 1111
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
// printf("set done!\n\r");
return 0;
}
//int read_adc()
int main(void)
{
char *adc = "/dev/adc";//ad转换的设备节点文件
char *led = "/dev/led_c";
char buffer[512];//存放ad转换结果的
int len=0,d=0,R=0,i,vx,vz;
float v=0;
memset(buffer,0,sizeof(buffer));
if((fd_led = open(led, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open led err!\n");
else
printf("open led success!\n");
if((fd_adc = open(adc, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open adc err!\n");
else{
printf("open adc success!\n");
while(1)
{
len=read(fd_adc,buffer,15); //读取ad结果
if(len == 0)
printf("return null\n");
if(len != 0)
{
d = atoi(buffer); //d收取数值
printf("converted data is 0x%x\n",d);
R = (int)(d*10000/4095); //对应的电阻值R
printf("resistor value is %dΩ\n",R);
v = (float)(d*1.8/4095); //对应的电压值v
printf("voltage value is %1.3fv\n",v);
sleep(2);
if(v > 1)
{
ioctl(fd_led,0,0);//13
ioctl(fd_led,0,1);//8
}
else
{
ioctl(fd_led,1,0);//13
ioctl(fd_led,1,1);//8
}
vz = v;
vx = (v-vz)*100;
uart(R,vz,vx);
}
}
close(fd_adc);
close(fd_led);
return 0 ;
}
}