16.火焰传感器实验

实验现象

  检测到有火源报警。

理论学习

  远红外火焰传感器可以用来探测火源或者其他一些波长在700纳米~1000纳米范围内的热源。在机器人比赛中远红外火焰探头起着非常重要的作用,它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人、足球机器人等。

  远红外火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60°,其中红外波长在880纳米附近时,其灵敏度达到最大。远红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~1023范围内数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。

程序代码

#define ADpin A0
#define Buzzer 2
int ADBuffer = 0;

void setup()
{
  pinMode(Buzzer,OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  ADBuffer = analogRead(ADpin);		//读AD值
  Serial.print("AD = ");
  Serial.println(ADBuffer);
  
  if(ADBuffer > 20)			//当AD值大于设定值时候
  {
    digitalWrite(Buzzer,HIGH);	       //蜂鸣器报警
  }
  else
  {
    digitalWrite(Buzzer,LOW);		//蜂鸣器取消报警
  }
  delay(500);				//延时500ms
}




下面是基于CC2530的火焰传感器代码,供您参考: ```c #include "ZComDef.h" #include "AF.h" #include "OSAL.h" #include "OSAL_Tasks.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include "DebugTrace.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" #include "hal_adc.h" #define APP_ENDPOINT 10 #define APP_PROFID 0x0F08 #define APP_DEVICEID 0x0001 #define APP_DEVICETYPE 0x01 #define APP_MAX_CLUSTERS 1 #define APP_CLUSTERID 0x0006 #define SAMPLE_PERIOD 2000 //采样周期2秒 byte appTaskID; byte appEndpoint; void appInit(void); void appTask(byte taskID); void appSendData(void); void halKeyCback(byte key, byte keyStatus); void main(void) { osal_sys_init(); HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH); appInit(); osal_start_system(); } void appInit(void) { ZDO_Init(); appEndpoint = AF_RegisterEndpoint(APP_ENDPOINT, &appTaskID); ZDO_RegisterForZDOMsg(appTaskID, Match_Desc_rsp); RegisterForKeys(appTaskID); HalUARTInit(); HalUARTWrite(HAL_UART_PORT_0, "CC2530 Flame Sensor Demo\n", 25); HalAdcInit(); osal_set_event(appTaskID, SAMPLE_PERIOD); } void appTask(byte taskID) { uint16 events; afIncomingMSGPacket_t *MSGpkt; (void)taskID; events = osal_clear_event(appTaskID, 0); if (events & SAMPLE_PERIOD) { appSendData(); osal_start_timerEx(appTaskID, SAMPLE_PERIOD, SAMPLE_PERIOD); } MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(appTaskID); while (MSGpkt) { switch (MSGpkt->hdr.event) { case ZDO_STATE_CHANGE: ZDO_STATE_CHANGE_CB(MSGpkt->hdr.status); break; case KEY_CHANGE: halKeyCback(*(byte*)MSGpkt->hdr.data, ((keyChange_t*)MSGpkt->hdr.data)->state); break; case AF_DATA_CONFIRM_CMD: break; default: break; } osal_msg_deallocate((uint8 *)MSGpkt); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(appTaskID); } } void appSendData(void) { uint16 adcValue; int mV; uint8 data[2]; HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); HalAdcRead(HAL_ADC_CHANNEL_0, HAL_ADC_RESOLUTION_8, &adcValue); mV = HalAdcToMillivolt(adcValue); if (mV > 2000) { HalUARTWrite(HAL_UART_PORT_0, "Flame detected!\n", 16); data[0] = 0x01; data[1] = 0x00; AF_DataRequest(appEndpoint, &zAddrCoord, APP_CLUSTERID, 2, data, &appTaskID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); } else { HalUARTWrite(HAL_UART_PORT_0, "No flame detected.\n", 19); } HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); } void halKeyCback(byte key, byte keyStatus) { if (key == HAL_KEY_SW_2 && keyStatus == HAL_KEY_EVENT) { HalUARTWrite(HAL_UART_PORT_0, "Button pressed.\n", 16); appSendData(); } } ``` 该代码使用了CC2530芯片内置的ADC模块来采集火焰传感器输出的模拟信号,并通过串口输出检测结果。如果检测到火焰,将会向协调器发送一个数据包。注意,该代码只注册了一个端点(Endpoint),并且只支持一个簇(Cluster),如需扩展,请自行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值