本项目包含proteus仿真arduino,fpga控制pwm,solidworks制图,web网站。
项目名称:化学工厂有毒气体监控和预警系统
项目简介:主要包含温度传感器,声光模块,lcd显示屏,直流电机,烟雾传感器,红外线传感器。
这里先post一个arduino代码。(由于代码是自己写的,所以注释废话啥的比较多,见谅😓)
//先设计,设计完了立刻调试,不要等到最后一起!!
//引用传感器库
#include <MQ2.h> //气体浓度高,数值越高
#include <dht11.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
//定义传感器引脚
//如果用int类型来命名引脚的话 int DHT11PIN 2 会占用内存空间 一共只有2KB的空间可以用来存储运算数据,如果我们写了很多类似的int型代码,则有可能会出现内存不足的现像,尽可能的节约对SRAM的使用,这就出现了#define LED 13;这种写法
//为了防止后面的esp8266需要中断口 改为9号引脚
#define smog_AI A0
#define smog_DI 3 //暂时用不到
#define flame_DI 4
#define buzzer_DO 5
#define light_yellow 6
#define light_red 7
#define relayPin 8
#define DHT11PIN 9
LiquidCrystal lcd(15, 14, 12, 11, 10, 2);
//0、1为Rx、Tx 针脚,这两个针脚一般作为串口使用,非串口设备尽量不占用该针脚。(Rx发送,Tx接收)
//2、3为中断口,分别对应中断0、中断1,需要中断功能的设备,必须接入此。
//2~13、A0~A5,共18个针脚,都可以作为数字针脚,编号连起来,分别是2~19。
//13针脚只能为OUTPUT模式,只能作为输出端,不能用作输入端。
//A6、A7针脚只能用做模拟信号,不能用作数字信号。
//除了0、1、13、A6、A7这几个针脚比较特殊外,其他的针脚都可以按照正常功能使用。也就是说,2~12、A0~A5这17个针脚,基本可以放心使用
//3,5,6,9,10,11 可以输出pwm波
//定义气体传感器 保存烟雾数据
float smogValue=800; //variable to store sensor value
dht11 DHT11; //类名
String incomingByte;
String inData;
String function;
//定义预警阈值
#define GAS_THRESHOLD 300 //没有找到合适的,暂定300
#define TEMP_THRESHOLD 30 //预警系统只对最高温度进行响应,由于项目的可拓展性强,所有的阈值都来自于一般产品中的指导数值
#define HUM_THRESHOLD_min 45 //暂时没想到湿度的危害
#define HUM_THRESHOLD_max 45
void setup() {
//初始化传感器引脚
pinMode(DHT11PIN,INPUT);
pinMode(smog_AI,INPUT);
pinMode(flame_DI,INPUT);
pinMode(buzzer_DO,OUTPUT);
pinMode(light_yellow,OUTPUT);
pinMode(light_red,OUTPUT);
pinMode(relayPin, OUTPUT);
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("TEMPRATURE: ");
Serial.begin(9600);
}
void loop() {
//dht11读取温湿度数据
int chk = DHT11.read(DHT11PIN);
//dht11读取数据,打印
float humiditity =DHT11.humidity;
float temp = DHT11.temperature;
Serial.print("Humidity (%): ");
Serial.println(humiditity);
delay(100);
//Serial.println(humiditity, 2);
Serial.print("Temperature (oC): ");
Serial.println(temp);
delay(100);
//mq2读取打印气体浓度
smogValue = analogRead(smog_AI);
Serial.print("Smog Value: ");
Serial.println(smogValue);
delay(100);
lcd.setCursor(0,1);
// Print a message to the LCD.
lcd.print(humiditity);
lcd.setCursor(0,2);
lcd.print(temp);
//红灯亮,蜂鸣器响,启动继电器
if(digitalRead(flame_DI) == LOW && digitalRead(smog_DI) == LOW && temp >= TEMP_THRESHOLD) //当模拟值大于1时蜂鸣器鸣响,阈值根据实际测试进行修改,为了防止误报,加入多条件限制 温度加入是考虑到吸烟的情况
{
Serial.println(" | Fire detected! ");
digitalWrite(buzzer_DO,HIGH);//设置该引脚为高电平
delay (100);
digitalWrite (buzzer_DO,LOW);//设置该引脚为低电平
delay(100);//输出pwm波为200ms 占空比50%
digitalWrite(buzzer_DO,HIGH);//设置该引脚为高电平
delay (100);
digitalWrite (buzzer_DO,LOW);
delay(100);
digitalWrite(light_red,HIGH);
delay(140);
digitalWrite(light_red,LOW);
delay (70);
digitalWrite(light_yellow,HIGH);
delay(120);
digitalWrite(light_yellow,LOW);
delay(80);
digitalWrite(relayPin,HIGH);
delay(160);
digitalWrite(relayPin,LOW);
delay(40); //由于arduino只能处理单线程,所以必须中断。 多个设备依次执行任务时,delay的时间应保持一直,如果相差一个数量级以上,在proteus中效果不明显
}
//mq2检测气体浓度和温度 黄灯闪烁 蜂鸣器启动
else if(digitalRead(smog_DI) == LOW && temp >= TEMP_THRESHOLD)
{
digitalWrite(relayPin,LOW);
Serial.println(" | Smoke detected! ");
digitalWrite(buzzer_DO,HIGH);//设置该引脚为高电平
delay (100);
digitalWrite (buzzer_DO,LOW);//设置该引脚为低电平
delay(100) ;
digitalWrite(light_red,HIGH);
delay(140);
digitalWrite(light_red,LOW);
delay (70);
digitalWrite(light_yellow,HIGH);
delay(120);
digitalWrite(light_yellow,LOW);
delay (80);
}//dht11检测气体 红黄灯闪烁
else if(digitalRead(smog_DI) == LOW){
digitalWrite(light_red,HIGH);
delay(140);
digitalWrite(light_red,LOW);
delay (70);
digitalWrite(light_yellow,HIGH);
delay(120);
digitalWrite(light_yellow,LOW);
delay(80);
}
// //dht11检测温度 黄灯闪烁 蜂鸣器启动
// else if (temp >= TEMP_THRESHOLD)
// {
// digitalWrite(relayPin,LOW);
// Serial.println(" | Heated temperature! ");
//
// digitalWrite(buzzer_DO,HIGH);//设置该引脚为高电平
// delay (100); //不能设置的太小 不然proteus仿真结果不明显看不出来
// digitalWrite (buzzer_DO,LOW);//设置该引脚为低电平
// delay(100) ;
// digitalWrite(light_yellow,HIGH);
// delay(120);
// digitalWrite(light_yellow,LOW);
// delay(80);
// }
else if(temp >= TEMP_THRESHOLD){
digitalWrite(light_yellow,HIGH);
delay(120);
digitalWrite(light_yellow,LOW);
delay(80);
}
// int ledPin = 9; // PWM波输出引脚
//
//void setup() {
// pinMode(ledPin, OUTPUT); // 设置引脚为输出模式
//}
//
//void loop() {
// for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) { // 逐渐增加PWM占空比
// analogWrite(ledPin, dutyCycle); // 生成PWM波
// delay(10); // 延时一段时间
// }
// for (int dutyCycle = 255; dutyCycle >= 0; dutyCycle--) { // 逐渐减小PWM占空比
// analogWrite(ledPin, dutyCycle); // 生成PWM波
// delay(10); // 延时一段时间
// }
//}
if(Serial.available()>0){//串口数据接收
char ch=Serial.read();
if(ch == 'a'){
digitalWrite(light_yellow,HIGH);
}else if(ch == 'b'){
digitalWrite(light_yellow,LOW);
}else if(ch == 'c'){
digitalWrite(light_red,HIGH);
}else if(ch == 'd'){
digitalWrite(light_red,LOW);
}else if(ch == 'e'){
digitalWrite(buzzer_DO,HIGH);
}else if(ch == 'f'){
digitalWrite(buzzer_DO,LOW);
}else if(ch == 'g'){
digitalWrite(relayPin,HIGH);
}else if(ch == 'h'){
digitalWrite(relayPin,LOW);
}
}
}
C#示例
solidwork示例
web示例
Proteus仿真的库 https://mp.csdn.net/mp_blog/creation/editor/new/128996230
Arduino代码【免费】Proteus+FPGA项目设计联合仿真(Arduino源代码)-公共安全文档类资源-CSDN文库
C#代码Proteus+FPGA项目设计联合仿真(C#上位机)资源-CSDN文库
solidwork源文件Proteus+FPGA项目设计联合仿真(solidworks)资源-CSDN文库
Verilog代码(设计时应注意 时钟频率周期太长 不足以显示一个完整的pwm波 )
Proteus+FPGA项目设计联合仿真(FPGA仿真)资源-CSDN文库
Web代码Proteus+FPGA项目设计联合仿真(Web)资源-CSDN文库
Proteus仿真Proteus+FPGA项目设计联合仿真(proteus)-公共安全文档类资源-CSDN文库
由于自己在做项目的时候发现网上的有关资源少得可怜,特写此博客。
注:以上内容仅供参考,如有因为抄袭而引起的事件,本人概不负责!