3.4.1主控界面
主控界面主要是点击按钮,通过网络发送相应的指令到服务器,主要代码如下:
/* 相关指令 */
QString temperatureOn = \"1\"; //温度检测开指令 QString temperatureOff = \"2\"; //温度检测关指令 QString invadeOn = \"3\"; //入侵检测开指令 QString invadeOff = \"4\"; //入侵检测关指令 QString soilOn = \"5\"; //土壤湿度检测开指令 QString soilOff = \"6\"; //土壤湿度检测关指令 QString rainOn = \"7\"; //降雨检测开指令 QString rainOff = \"8\"; //将与检测关指令 QString lightVoiceOn = \"9\"; //声控开关开指令 QString lightVoiceOff = \"0\"; //声控开关关指令 cli_Main_Dialog::cli_Main_Dialog(QWidget *parent) : QDialog(parent),
ui(new Ui::cli_Main_Dialog) { /* 加载界面 */ ui->setupUi(this); //QT的TCP方式
client = new QTcpSocket(this); //创建QTCP套接字 client->connectToHost(\"192.168.1.143\//连接主机 }
cli_Main_Dialog::~cli_Main_Dialog() {
delete ui; }
/* 消息发送函数 */
void cli_Main_Dialog::send_msg(const char *cmd, int len) {
if(client->write(cmd, len) == -1) {
QMessageBox::warning(this, tr(\"warning\"), tr(\"this is warning\"), QMessageBox::Yes); } }
/* 温度控制按钮 */
void cli_Main_Dialog::on_temperatureButton_clicked() {
if(ui->temperatureButton->text() == \"温度检测(点击关闭)\"){ cli_Main_Dialog::send_msg(temperatureOff.toStdString().c_str(),
strlen(temperatureOff.toStdString().c_str()));
ui->temperatureButton->setText(\"温度检测(点击开启)\");
}else if(ui->temperatureButton->text() == \"温度检测(点击开启)\"){ cli_Main_Dialog::send_msg(temperatureOn.toStdString().c_str(),
strlen(temperatureOn.toStdString().c_str()));
ui->temperatureButton->setText(\"温度检测(点击关闭)\"); } }
/* 入侵检测按钮 */
void cli_Main_Dialog::on_invadeButton_clicked() {
if(ui->invadeButton->text() == \"入侵检测(点击关闭)\"){
cli_Main_Dialog::send_msg(invadeOff.toStdString().c_str(),
strlen(invadeOff.toStdString().c_str()));
ui->invadeButton->setText(\"入侵检测(点击开启)\"); }else if(ui->invadeButton->text() == \"入侵检测(点击开启)\"){ cli_Main_Dialog::send_msg(invadeOn.toStdString().c_str(),
strlen(invadeOn.toStdString().c_str()));
ui->invadeButton->setText(\"入侵检测(点击关闭)\"); } }
/* 土壤检测按钮 */
void cli_Main_Dialog::on_soilButton_clicked() {
if(ui->soilButton->text() == \"土壤检测(点击关闭)\"){
cli_Main_Dialog::send_msg(soilOff.toStdString().c_str(), strlen(soilOff.toStdString().c_str()));
ui->soilButton->setText(\"土壤检测(点击开启)\"); }else if(ui->soilButton->text() == \"土壤检测(点击开启)\"){ cli_Main_Dialog::send_msg(soilOn.toStdString().c_str(),
strlen(soilOn.toStdString().c_str()));
ui->soilButton->setText(\"土壤检测(点击关闭)\"); } }
/* 降雨检测按钮 */
void cli_Main_Dialog::on_rainButton_clicked() {
if(ui->rainButton->text() == \"降雨检测(点击关闭)\"){
cli_Main_Dialog::send_msg(rainOff.toStdString().c_str(),
strlen(rainOff.toStdString().c_str()));
ui->rainButton->setText(\"降雨检测(点击开启)\"); }else if(ui->rainButton->text() == \"降雨检测(点击开启)\"){ cli_Main_Dialog::send_msg(rainOn.toStdString().c_str(),
strlen(rainOn.toStdString().c_str()));
ui->rainButton->setText(\"降雨检测(点击关闭)\"); } }
/* 光控开关按钮 */
void cli_Main_Dialog::on_lightVoiceButton_clicked() {
if(ui->lightVoiceButton->text() == \"光控开关(点击关闭)\"){ cli_Main_Dialog::send_msg(lightVoiceOff.toStdString().c_str(),
strlen(lightVoiceOff.toStdString().c_str()));
ui->lightVoiceButton->setText(\"光控开关(点击开启)\"); }else if(ui->lightVoiceButton->text() == \"光控开关(点击开启)\"){ cli_Main_Dialog::send_msg(lightVoiceOn.toStdString().c_str(),
strlen(lightVoiceOn.toStdString().c_str()));
ui->lightVoiceButton->setText(\"光控开关(点击关闭)\"); } }
3.4.2 登录模块
登录模块会获取用户输入密码然后到密码存储文件对比已存储的密码,然后验证是否匹配,是否能登录到主控界面。代码如下: loginDialog::loginDialog(QWidget *parent) : QDialog(parent),
ui(new Ui::loginDialog) { /* 加载界面 */ ui->setupUi(this);
/* 点击登录按钮时的信号和槽处理函数绑定 */
connect(this,SIGNAL(login_to_clicked()),this,SLOT(accept())); }
loginDialog::~loginDialog() {
delete ui; }
/* 输入框内容检测部分 */
void loginDialog::on_registerButton_clicked() {
if(ui->usrNameEdit->text() == \"\" && ui->passwdEdit->text() == \"\"){ QMessageBox::about(this,tr(\"提示信息\"),
tr(\"用户名和密码不能为空!\"));
}else if(ui->usrNameEdit->text() != \"\" && ui->passwdEdit->text() == \"\"){ QMessageBox::about(this,tr(\"提示信息\"),tr(\"密码不能为空!\")); }else if(ui->usrNameEdit->text() == \"\" && ui->passwdEdit->text() != \"\"){ QMessageBox::about(this,tr(\"提示信息\"),tr(\"用户名不能为空!\")); }else{
QString sFilePath = \"F:\\\\passwd.txt\"; //密码保存文件 QFile file(sFilePath);
if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) {
QMessageBox::critical(NULL, \"提示\无法创建文件\"); return ; }
QTextStream out(&file);
out< out< QMessageBox::about(NULL, \"提示\ \"写入F:\\\\passwd.txt文件成功\\n请返回登陆\"); /* 注意写入方式的选择,注意写完后的关闭操作!*/ } } void loginDialog::on_cancelButton_clicked() { close();//如果跟login一样做成槽函数,会出现需要关闭两次的小bug, //此时也必须把return a.exec换成return 0; } void loginDialog::on_loginButton_clicked() { u_name = ui->usrNameEdit->text(); u_passwd = ui->passwdEdit->text(); QString usrname = \"\"; QString passwd = \"\"; /* 读取密码,参与比较 */ QString sFilePath = \"F:\\\\passwd.txt\"; QFile file(sFilePath); if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) { QMessageBox::critical(NULL, \"提示\无法打开文件\"); return ; } QTextStream in(&file); while( !in.atEnd()){ usrname = in.readLine(); passwd = in.readLine(); } file.close(); if(u_name == usrname && u_passwd == passwd){ login_to_clicked(); }else{ QMessageBox::critical(NULL, \"ERROR\输入错误!\"); } } 3.4.3 温度检测模块 此模块是以DS18B20温度传感器作为依托,根据实时采集环境的温度值,然后可以根据声音传感器的返回值,播报出温度值,只要想知道温度,轻敲即可获得播报的温度值。主要代码如下: #define BUFSIZE 128 void temperature_deal(){ printf(\"in the func ...\\n\"); char cmd[256] = \"sudo espeak -ven+f3 -k5 -s150 \\\"now the temperature is \"; char *install1 = \"sudo modprobe w1-gpio\"; char *install2 = \"sudo modprobe w1-therm\"; system(install1); system(install2); float temp; int i, j; int fd; int ret; char buf[BUFSIZE]; char tempBuf[5]; DIR *dir; struct dirent *ptr; int k; char *dir_read; dir = opendir(\"/sys/bus/w1/devices\"); while((ptr = readdir(dir))!=NULL){ if(strstr(ptr->d_name, \"28-\")){ dir_read = ptr->d_name; } } /* 打开文件操作 */ strcat(dir_read, \"/w1_slave\"); char dir_aim[128] = \"/sys/bus/w1/devices/\"; strcat(dir_aim, dir_read); fd = open(dir_aim, O_RDONLY); if(-1 == fd){ perror(\"open devices file failed!\"); return ; } printf(\"%s\\n\ while(1){ ret = read(fd, buf, BUFSIZE); if(0 == ret){ break; } if(-1 == ret ){ if(errno == EINTR){ continue; } perror(\"read failed!\"); close(fd); return ; } } for(i = 0; i < sizeof(buf); i++){ if(buf[i] == 't' && buf[i+1] == '='){ for(j = 0; j < sizeof(tempBuf); j++){ tempBuf[j] = buf[i+2+j]; } } } temp = (float)atoi(tempBuf)/1000; printf(\"%.3f C\\n\char temp_now[4]; sprintf(temp_now, \"%.1f\strcat(cmd, temp_now); strcat(cmd, \"\\\"\"); system(cmd); close(fd); } 声音检测部分: void voice_deal(void){ wiringPiSetup(); pinMode(0, INPUT); int i = 11; while(1){ delay(500); i = digitalRead(0); if(i == 0){ printf(\"have voice...flag:%d \\n\ temperature_deal(); delay(500); } i = 5; } } 3.4.4 入侵检测模块 本模块是通过人体红外感应传感器实时监测指定地点的人员活动状况,当检测到有人时,可以通过短信的形式通知主人或者摄像头模块实施抓捕图像,达到有效的安防目的(这里以蜂鸣器代替报警部分实现)。 红外感应部分主要代码如下: void invade_deal(void){ wiringPiSetup(); pinMode(2, INPUT); int i = 11; while(1){ delay(500); i = digitalRead(2); if(i == 0){ printf(\"have people\\n\"); beep_deal(); } else{ printf(\"no people\\n\"); beep_stop(); } delay(500); i = 6; } } 蜂鸣器部分代码如下: void beep_deal(void){ wiringPiSetup(); pinMode(3, OUTPUT); digitalWrite(3, HIGH); delay(500); digitalWrite(3, LOW); delay(500); } void beep_stop(void){ pinMode(3, INPUT); digitalWrite(3, LOW); return ; } 3.4.5土壤湿度检测模块 本模块的初衷是做一个自动浇花装置,以防止有的时候忘记浇水。本模块通过土壤湿度传感器检测土壤湿度,设定传感器的阀值,当湿度小于阀值时,就会自动触发步进电机模块,从而引发安装好的水源的自动浇水的动作。当湿度大于设定阀值的时候,又会自动还原步进电机的旋转角度,停止水源装置自动浇水的动作。土壤湿度检测部分的代码如下: void stepmotor_init(){ if(-1 == wiringPiSetup()){ printf(\"wiringPi setup failed!\\n\"); return ; } pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void soil_deal(void){ stepmotor_init(); pinMode(21, INPUT); int i = 11; while(1){ delay(2000); i = digitalRead(21); if(i == 1){ //需要浇水 printf(\"start give water...forward(90度)\\n\"); foreward(3, 150); delay(2000); stop(); } else if(i == 0){ printf(\"end give water...backward(90度)\\n\"); backward(3, 150); stop(); printf(\"OK\\n\"); } i = 6; } } 步进电机部分的主要代码如下: void setStep(int a, int b, int c, int d){ digitalWrite(IN1, a); digitalWrite(IN2, b); digitalWrite(IN3, c); digitalWrite(IN4, d); } void stop(){ setStep(0,0,0,0); } void foreward(int t, int steps){ int i; for(i = 0; i < steps; i++){ setStep(1,0,0,0); delay(t); setStep(0,1,0,0); delay(t); setStep(0,0,1,0); delay(t); setStep(0,0,0,1); delay(t); } } void backward(int t, int steps){ int i; for(i = 0; i < steps; i++){ setStep(0,0,0,1); delay(t); setStep(0,0,1,0); delay(t); setStep(0,1,0,0); delay(t); setStep(1,0,0,0); delay(t); } } 3.4.6降雨检测模块 本模块的设计是防止用户出门在外,以防没关窗户时突然下雨的意外状况。通过连接一个雨滴传感器就可以轻松完成此功能,当雨滴传感器检测到下雨状况的时候,就会触发电机的发动动作,然后通过电机完成关窗动作,防止雨水入侵。雨滴检测部分的主要代码如下: void rain_deal(void){ stepmotor_init(); pinMode(1, INPUT); int i = 5; while(1){ delay(3000); i = digitalRead(1); if(i == 0){ printf(\"raining...flag:%d \\n\ printf(\"start close the door\\n\"); foreward(3, 150); delay(5000); stop(); }else if(i == 1){ printf(\"no water on the board...flag:%d \\n\ printf(\"start open the door\\n\"); backward(3, 150); stop(); } i = 5; } return ; } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务