Linux系统和itop开发版设计城市无景观照明控制

利用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 ;

}
}