一、前言
上回FastBond2阶段1的文档中,展示了使用Scheme-it绘制的框图,并在Kicad进行了原理图和PCB的设计,相比于其他设计的软件,kicad更加的方便快捷。同时说明了火灾烟雾报警器的方法以及原理,也说明了项目中所使用到的活动规定厂家的芯片。
想了解阶段1的具体内容可以通过链接跳转:
在一阶段设计中由于初版PCB的设计版型偏大,为了更好的节省空间,现在参加FastBont第二阶段,所以进行对PCB板块的缩小、打板焊接以及程序的编写。
二、原理图与PCB设计
原理图设计是使用Kicad绘制的,本次设计主要采用的是Microchip的AT89C51RC单片机为基础进行设计,利用火焰传感器对火源亮度进行检测,温度传感器18B20进行温度检测,烟雾传感器MQ-2进行对空气有害气体进行检测。
在原理图中我分别绘制了各个模块的电路,使用网络标签的连接,,不仅让接线更加的清晰明了、整洁,还能清晰的在原理图中展示出电路各个的功能模块。
PCB板的绘制和走线同样也是用Kicad绘制,这是最终板框的设计,相比于初版能够更好的利用空间,更加的集成化,大大的节省所需要的空间。对于烟雾传感器和火焰传感器所用的模块,我用的是排母来代替接线,同时对板子进行了顶层和底层GND的铺铜处理,让导线的走势更加的便捷。
三、主要代码展示
首先是主函数介绍,一开始定义温度值、烟雾值和循环的字符,然后LCD1604需要对它进行初始化,读取需要检测报警的数值,如果数值异常,则返回重新定义的值;主函数循环体,对需要读取的数值进行循扫描显示;
void main(void)
{
int temp; // 保存温度值
uchar num; // 保存烟雾值
uchar i; // 循环变量
LcdInit(); // 液晶功能初始化
LcdShowInit(); // 液晶显示内容初始化
gMqAlarm=EEPROM_Read(0x2000); // 从EEPROM中读取报警值
if((gMqAlarm==0)||(gMqAlarm>100)) // 如果读出来数据异常,则重新赋值30
gMqAlarm=30;
LcdGotoXY(0,11); // 光标定位
LcdPrintNum1(gMqAlarm); // 显示烟雾浓度的报警值
gTempAlarm=EEPROM_Read(0x2001)-55; // 将温度报警值读取出来
if((gTempAlarm<=-55)||(gTempAlarm>125)) // 如果读出来数据异常,则重新赋值400 gTempAlarm=40;
LcdGotoXY(1,11); // 光标定位
LcdPrintNum2(gTempAlarm); // 显示温度的报警值
while(DS18B20_ReadTemp()==85) // 等待温度传感器初始化完成
{
DelayMs(10);
}
while(1)
{
num=Get_ADC0832(); // 获取烟雾的浓度值
num=num/2.2; // 调整浓度值,使其在0-100之间变化
if(num>100)
num=100;
LcdGotoXY(0,5); // 液晶光标定位到第0行第5列
LcdPrintNum1(num); // 显示烟雾浓度的值
temp=DS18B20_ReadTemp(); // 读取温度值
LcdGotoXY(1,5); // 液晶光标定位到第1行第5列
LcdPrintNum2(temp); // 显示温度值
AlarmJudge(num,temp); // 报警判断
for(i=0;i<15;i++) // 执行15次循环
{
KeyScanf(); // 按键扫描
DelayMs(10); // 延时
}
}
}
然后这是报警判断,对三个需报警的参数进行判断,达到所设的报警阈值就发出低电平,让LED亮和蜂鸣器发声;
void AlarmJudge(uchar dat1, int dat2)
{
/*火焰报警判断*/
if(Fire_P==0)
{
DelayMs(50);
if(Fire_P==0)
{
Led1_P=0;
}
}
else
{
Led1_P=1;
}
/*烟雾报警判断*/
if(dat1>gMqAlarm)
{
Led3_P=0;
}
else
{
Led3_P=1;
}
/*温度报警判断*/
if(dat2>gTempAlarm)
{
Led2_P=0;
}
else
{
Led2_P=1;
}
/*蜂鸣器报警判断*/
if((Led1_P==0)||(Led2_P==0)||(Led3_P==0))
Buzzer_P=0;
else
Buzzer_P=1;
}
这是按键功能实现的代码,能够对烟雾报警值和温度报警值的阈值进行设置;
void KeyScanf()
{
if(Key1_P==0)
{
LcdGotoXY(0,13);
LcdWriteCmd(0x0f); // 显示光标,并闪烁
/*****烟雾报警值的设置**********************/
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
while(Key1_P!=0) // 如果按键1按下,那么跳到下一级设置
{
if(Key2_P==0) // 如果减按键被按下
{
if(gMqAlarm>1) // 只有gMqAlarm大于1才能减1
gMqAlarm--;
LcdGotoXY(0,11); // 液晶光标定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改变后的报警值
LcdGotoXY(0,13);
DelayMs(250); // 延时一下
}
if(Key3_P==0) // 如果加按键被按下
{
if(gMqAlarm<100) // 只有gMqAlarm小于100才能加1
gMqAlarm++;
LcdGotoXY(0,11); // 液晶光标定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改变后的报警值
LcdGotoXY(0,13);
DelayMs(250); // 延时一下
}
}
/*****温度报警值设置******************/
LcdGotoXY(1,13); // 光标定位
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
while(Key1_P!=0) // 如果按键1按下,则退出设置模式
{
if(Key2_P==0) // 如果减按键被按下
{
if(gTempAlarm>-54) // 只有gTempAlarm大于-54才能减1
gTempAlarm--;
LcdGotoXY(1,11); // 液晶光标定位到第1行第11列
LcdPrintNum2(gTempAlarm); // 刷新改变后的报警值
LcdGotoXY(1,13);
DelayMs(250); // 延时一下
}
if(Key3_P==0) // 如果加按键被按下
{
if(gTempAlarm<125) // 只有gTempAlarm小于125才能加1
gTempAlarm++;
LcdGotoXY(1,11); // 液晶光标定位到第0行第11列
LcdPrintNum2(gTempAlarm); // 刷新改变后的报警值
LcdGotoXY(1,13);
DelayMs(250); // 延时一下
}
}
/*****退出报警值的设置***************/
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
Sector_Erase(0x2000); // 擦除单片机内部EEPROM的数据
EEPROM_Write(0x2000,gMqAlarm); // 将新设置的烟雾报警值写入EEPROM
EEPROM_Write(0x2001,gTempAlarm+55); // 将新设置的温度报警值+55写入
LcdWriteCmd(0x0c); // 关闭光标
}
}
四、成品展示
该板子焊接组装完成是这样,由于没有外壳,外观展示暂时这样。LED屏幕第一排是Gas是空气中有害气体的数值,前面005是实时对气体检测的数值,后面050是空气中有害气体所设置的报警阈值;第二排Tmp是温度的显示的数值,后面数值和前面同理。下面有四个按键,功能分别是:第一个,复位功能,能够对单片机进行一个手动复位;第二个,设置功能,按第一下的时候进入烟雾、有害气体浓度报警阈值的设置,按第二下的时候进入温度的报警阈值的设置,按第三下的时候确认以上设置;后面两个按键,是对设置时候的数值进行加减操作。
五、活动总结:
感谢硬禾科技举办的这次活动,看着自己画的板子做成成品,并且还可以正常工作,有所应用,内心十分的激动。虽然在这过程中遇到了很多困难,但最终都解决了,并且收获很多。