/*
******************************************************************************
* @file main.c / 3-control
* @author Jeep.zhang
* @version V1.0
* @date 05-Dec-2015
* @brief Main Service Routines.
******************************************************************************
* @attention
* AT+GMR
* AT version:0.50.0.0(Sep 18 2015 20:55:38)
* SDK version:1.4.0
* compile time:Sep 18 2015 21:46:52
* OK
* 1.Espressif-SDK,The Latest Version:esp_iot_sdk_v1.4.0_15_09_18
* 2.Please refer to:esp_iot_sdk_v1.4.0_15_09_18\esp_iot_sdk_v1.4.0\bin\at
* 3.or Reference information is as follows:
* ---------Flash size 32Mbit: 512KB+512KB-----------ESP-12F
* boot_v1.2+.bin 0x00000
* user1.1024.new.2.bin 0x01000
* esp_init_data_default.bin 0x3fc000 (optional)
* blank.bin 0x7e000 & 0x3fe000
* --------------------------------------------------
* 4.MCU Model: STM8S005K6,16MHz,FLASH(32K)/RAM(2K)/EEPROM(128bytes)
* 5.WIFI Module: ESP-WROOM-02(Espressif)/ESP-03(AiThinker)
*
*
© COPYRIGHT 2015 www.ifish7.com
******************************************************************************
*/
#include "STM8S005K6.h"
#include
//#include /* for printf */
/**********************************************/
#define factory_data 0x0a // 厂商编号
#define pcb_data 0x0c // 硬件型号
#define mcu_data 0x01 // 版本号
// 按键值定义H
#define Lamp1_Key1 0x1 // lamp1
#define Lamp2_Key2 0x2 // lamp2
#define UVC_Key3 0x3 // UVC
#define Adjust_Key4 0x4 // 调节键
#define Lamp_ShiDuan_Key5 0x5 // 时段照明
#define Clock_Setup_Key6 0x6 // 时间设置
#define K1K3 0x7 // 组合键
#define K2K4 0x8 // 组合键
#define K3K5 0x9 // 组合键
#define K4K6 0xa // 组合键
// (HT1621B:LCD)命令字定义:100 A5A4A3A2-A1A0D0D1-D2D3
//#define Read_Data 0xc0 // Read Data
//#define Write_Data 0xa0 // Write Data/Read-Modify-Write Data
#define Command 0x80 // Command
#define sysen 0x02 // 1 0 0 0000-0001-X
#define lcdon 0x06 // 1 0 0 0000-0011-X
#define lcdoff 0x04 // 1 0 0 0000-0010-X
#define rc256k 0x30 // 1 0 0 0001-10XX-X
#define bias 0x52 // 1/4 0x50 1/3
#define tone2k 0x80 // 1 0 0 100X-0XXX-X
#define toneon 0x12 // 1 0 0 0000-1001-X
#define toneoff 0x10 // 1 0 0 0000-1000-x
// 寄存器定义
#define RAMBIT 0x80
unsigned char state0 @RAMBIT;
//@near unsigned char state0;
unsigned char flag0 @RAMBIT+1;
unsigned char flag1 @RAMBIT+2;
unsigned char flag2 @RAMBIT+3;
unsigned char flag3 @RAMBIT+4;
unsigned char flag4 @RAMBIT+5;
unsigned char flag5 @RAMBIT+6;
//unsigned char flag6 @RAMBIT+7;
//unsigned char flag7 @RAMBIT+8;
// 寄存器flag各位变量定义
_Bool flag_TimeSetup_Jump @flag0:0;
_Bool flag_have_key @flag0:1;
_Bool flag_ClockTime_Change @flag0:2; // 钟表时间设置变化了,保存EEPROM
_Bool flag_TCP0_Connected @flag0:3;
_Bool flag_ScreenLock_Status @flag0:4;
_Bool flag_unlock_key @flag0:5;
_Bool flag_RS232_TimeoutStart @flag0:6;
_Bool flag_WiFi_ready @flag0:7;
// 寄存器flag1各位变量定义
_Bool flag_ClockTimeSetting @flag1:0;//s1
_Bool flag_Colon_Jump @flag1:1;
_Bool flag_Buzzering @flag1:2;
_Bool flag_Receive_NewFrame_Buffer0 @flag1:3;
_Bool flag_Receive_NewOneByte @flag1:4;
_Bool flag_WiFi_Connected @flag1:5;// 设备是否入网(路由器):1=入网,0=没入网;
_Bool flag_WiFi_Data_Sending @flag1:6; //=0数据发送完; =1正在发送数据
_Bool flag_Start_HeartBeat @flag1:7; //=1,启动心跳了
// 寄存器flag2各位变量定义
//_Bool flag_NoLoginBack150s_CIPSTART @flag2:0;
_Bool flag_Tempture_Abnormal @flag2:1;// 设备是否发送温度报警:1=可以,0=不可以
_Bool flag_TCP_Logined @flag2:2;// 设备是否登录服务器:1=登录,0=没登录;
_Bool flag_LoginTCP_SendOnce @flag2:3;
_Bool flag_HeartBeat10s @flag2:4;// 设备是否可以发心跳包10s:1=可以,0=不可以
_Bool flag_WiFi_Connect_Enable @flag2:5;// 设备是否发送设备状态信息5min:1=可以,0=不可以
_Bool flag_Buzzer @flag2:6;
_Bool flag_TCP0_Connecting @flag2:7;
// 寄存器flag3各位变量定义
_Bool flag_lamp4_onoff @flag3:0;
_Bool flag_lamp5_onoff @flag3:1;
_Bool flag_NoLoginBack150s_CIPSTART @flag3:2;
_Bool flag_ready5s_STARTSMART @flag3:3;
_Bool flag_DisConnect180s_StartRST @flag3:4;
_Bool flag_Have_STAMAC @flag3:5;
_Bool flag_Have_STAIP @flag3:6;
_Bool flag_ready_Monitoring5s @flag3:7;
// 寄存器flag4各位变量定义
_Bool flag_LampTimeSetting @flag4:0;
_Bool flag_LampTime_Change @flag4:1; // 灯的定时时间设置变化了,保存DS1302
_Bool flag_Open_Time @flag4:2;
_Bool flag_Close_Time @flag4:3;
_Bool flag_NoLoginBack_Monitoring150s @flag4:4;
_Bool flag_DisConnect_Monitoring180s @flag4:5;
_Bool flag_Tempture_Abnormal_Q0 @flag4:6;
_Bool flag_Tempture_Abnormal_Q1 @flag4:7;
// 寄存器flag5各位变量定义
_Bool flag_WiFi_Smarting @flag5:0;
_Bool flag_SEND_FAIL @flag5:1;
_Bool flag_RS232_Timeout @flag5:2;
_Bool flag_WiFi_Disconnect @flag5:3;
_Bool flag_UDP1_Connected @flag5:4;
_Bool flag_auto_hand_change @flag5:5;
_Bool flag_Restart_Connect_TCP @flag5:6;
_Bool flag_Enable_Connect_TCP @flag5:7;
// 寄存器state0各位变量定义
//_Bool flag_lamp2_onoff @state0:0;// t16 lamp2 灯光照明2
//_Bool flag_lamp1_onoff @state0:1;// t18 lamp1 灯光照明1
//_Bool flag_UVC_onoff @state0:2;// t19 //冲浪 lamp3 杀菌冲浪
//_Bool flag_WiFi_HaveSet @state0:3;// wifi已设置为1
//_Bool flag_auto_hand @state0:4;// 0=手动 1=自动
//_Bool flag_TemptureAlam @state0:5;// 0=
//_Bool flag_TemptureAlam_High @state0:6;
//_Bool flag_have_save_URL @state0:7;
unsigned char flag_lamp1_onoff=0;
unsigned char flag_lamp2_onoff=0;
unsigned char flag_UVC_onoff=0;
unsigned char flag_auto_hand=0;
// 端口定义*****(QTC186B:TOUCH)*****
_Bool B0 @PB_IDR:4;// PB4=Data0(QTC186B)
_Bool B1 @PB_IDR:5;// PB5=Data1(QTC186B)
_Bool B2 @PF_IDR:4;// PF4=Data2(QTC186B)
_Bool B3 @PD_IDR:2;// PD2=Data3(QTC186B)
// 端口定义*****(DS1302:RTC)*****
_Bool ds_rst @PC_ODR:2;// PC2=RST(DS1302)
_Bool ds_io @PC_ODR:1;// PC1=IO(DS1302)
_Bool ds_data @PC_IDR:1;// PC1=Data(DS1302) IN
_Bool ds_clk @PE_ODR:5;// PE5=CLK(DS1302)
// 端口定义*****(DENG1,DENG2,BENG,HEAT)*****
_Bool lamp2_PC5 @PC_ODR:5;// PC5=DENG1(Relay)
_Bool lamp1_PC6 @PC_ODR:6;// PC6=DENG2(Relay)
_Bool UVC_PC7 @PC_ODR:7;// PC7=BENG (Relay)
_Bool heating_PC4 @PC_ODR:4;// PC4=HEAT (Relay)
//_Bool ap_set_key @PD_IDR:0; //*****************
// 端口定义*****(HT1621B:LCD)*****
_Bool LCD_backled_PC3 @PC_ODR:3;// PC3=LED
_Bool ht1621_cs @PD_ODR:7;// PD7=LCD_CS(HT1621B)
_Bool ht1621_wr @PD_ODR:4;// PD4=LCD_WR(HT1621B)
_Bool ht1621_data @PD_ODR:3;// PD3=LCD_Data(HT1621B)
//_Bool power_pin @PD_ODR:0;
_Bool PB1_ESP_EN @PB_ODR:1;// ESP8266使能
_Bool PD0_ESP_RST @PD_ODR:0;// ESP8266硬件复位
unsigned int HeartBeat_0_TimeoutCounter=0;
unsigned int HeartBeat_1_TimeoutCounter=0;
unsigned int TCP0_TimeoutCounter=0;
unsigned int NoLoginBack150s_TimeoutCounter=0;
unsigned char WiFi_Disconnect_TimeoutCounter=0;
unsigned char Restart_Connect_TCP_TimeoutCounter=0;
unsigned char LockScreen_TimeoutCounter=0;
unsigned char UnLockScreen_TimeoutCounter=0;
unsigned char RS232_TimeoutCounter=0;
unsigned char DisConnect180s_TimeoutCounter=0;
unsigned char NoWiFi5s_TimeoutCounter=0;
unsigned char HeartBeat10s_TimeoutCounter=0; // 心跳时间是否到10s
unsigned char Lcd_Colon_TimeoutCounter=0;
unsigned char ThreeMS_Counter=0;
unsigned char auto_hand_TimeoutCounter;
unsigned char InBuffer_ID=0;
unsigned char Link_id='0';
unsigned char Key_Back=0;
unsigned char Key_Back_Config=0;
unsigned char Key_Shake=0;
unsigned char Key_Shake_Config=0;
unsigned char Disp_Year;
unsigned char Disp_Month;
unsigned char Disp_Day;
unsigned char Disp_Hour;
unsigned char Disp_Minute;
unsigned char Disp_Second;
unsigned char Disp_Week;
unsigned int Real_Tempture;
unsigned char LampTimeSetup_Stepper=0;
unsigned char ClockTimeSetup_Stepper=0;
unsigned char Tempture_Read_Counter=0;
unsigned char TemptureAlam_Close_Open_Setup=0;
unsigned char TemptureAlam_NormalLowHigh='N';// 'L'=低温状态,'H'=高温状态,'N'=正常状态
unsigned char System_Status=0; // flag_System_ERROR
unsigned int Set_High_Tempture=30;
unsigned int Set_Low_Tempture=5;
unsigned char Buzzer_TimeoutCounter=0;
unsigned char Receive_NewFrame_TimeoutCounter=0;
unsigned char Receive_Num0=0; // 单次接收帧,总字节数;
unsigned char Receive_Count0=0; // 单次接收帧,帧内字节索引号index;
unsigned char Receive_Count1=0;
unsigned char Send_Count=0; // 单次发送帧,帧内字节索引号index;
unsigned char Send_Num=0; // 单次发送帧,总字节数;
unsigned char Have_New_URL=0;
unsigned char Receive_NewFrame_Length=0;
unsigned char Function_Code=0; // ZDH,功能码=00~FEH,若=FFH,表明数据校验出错,重新发送上条命令
unsigned char * pStr1=NULL;
unsigned char * pStr0=NULL;
unsigned char AT_Command_Stepper=0; // 设备联网步骤;
unsigned char Connect_TCP_Counter=0;
//@tiny 由编译器自动在地址小于0x100的RAM中为其分配一个地址;
//@near 由编译器自动在地址大于0xFF 的RAM中为其分配一个地址;
@near unsigned char Timers_Enable[11]={0,0,0,0,0,0,0,0,0,0,0};
@near unsigned char Set_Open_Hour[10]={0,0,0,0,0,0,0,0,0,0};
@near unsigned char Set_Open_Minute[10]={0,0,0,0,0,0,0,0,0,0};
@near unsigned char Set_Close_Hour[10]={0,0,0,0,0,0,0,0,0,0};
@near unsigned char Set_Close_Minute[10]={0,0,0,0,0,0,0,0,0,0};
@near unsigned char LOC_IP_buf[4]={0,0,0,0}; // 本地IP
@near unsigned char RMT_IP_buf[4]={0,0,0,0}; // 远端IP
@near unsigned int RMT_IP_PORT=9954;
@near unsigned char LOC_MAC_buf[6]={0,0,0,0,0,0}; // 发送方MAC地址
@near unsigned char RMT_MAC_buf[6]={0,0,0,0,0,0}; // 接收方MAC地址
//@near unsigned char wifi_ssid[20];
//@near unsigned char wifi_password[20];
@near unsigned char Send_Buffer[120]; // 发送缓冲区
@near unsigned char Receive_Buffer0[120]; // 接受缓冲区0
@near unsigned char Receive_Buffer1[120]; // 接受缓冲区1
// 【www.ifish7.com=120.55.190.56】
@near unsigned char URL_ADDR[]={'w','w','w','.','i','f','i','s','h','7','.','c','o','m',0,0,0,0,0,0};
//@near unsigned char URL_ADDR[]={'1','2','0','.','5','5','.','1','9','0','.','5','6',0,0,0,0,0,0};
//@near unsigned char URL_ADDR[]={'1','9','2','.','1','6','8','.','6','1','.','1','2','8',0,0,0,0,0,0};
//AT+CIPSTART=0,"TCP","192.168.1.103",8080
//const unsigned char URL_TCP0_LOC103[]={'0',',','"','T','C','P','"',',','"','1','9','2','.','1','6','8','.','0','.','1','0','4','"',',','8','0','8','0'};
const unsigned char URL_UDP1_LOC104[]={'1',',','"','U','D','P','"',',','"','1','9','2','.','1','6','8','.','0','.','1','0','4','"',',','3','3','3'};
//AT+CIPSTART=0,"TCP","192.168.61.128",9955
//const unsigned char URL_TCP0_LOC128[]={'0',',','"','T','C','P','"',',','"','1','9','2','.','1','6','8','.','6','1','.','1','2','8','"',',','9','9','5','5'};
//const unsigned char URL_UDP1_LOC128[]={'1',',','"','U','D','P','"',',','"','1','9','2','.','1','6','8','.','6','1','.','1','2','8','"',',','3','3','3'};
//AT+CIPSTART=0,"TCP","www.ifish7.com",9955 【www.ifish7.com=120.55.190.56】
//const unsigned char URL_TCP0_ifish7[]={'0',',','"','T','C','P','"',',','"','w','w','w','.','i','f','i','s','h','7','.','c','o','m','"',',','9','9','5','5'};
const unsigned char URL_TCP0_ifish7[]={'0',',','"','T','C','P','"',',','"','1','2','0','.','5','5','.','1','9','0','.','5','6','"',',','9','9','5','5'};
//const unsigned char URL_UDP1_ifish7[]={'1',',','"','U','D','P','"',',','"','w','w','w','.','i','f','i','s','h','7','.','c','o','m','"',',','3','3','3'};
const unsigned char URL_UDP1_ifish7[]={'1',',','"','U','D','P','"',',','"','1','2','0','.','5','5','.','1','9','0','.','5','6','"',',','3','3','3'};
//**********************************AT CMD**************************************
// AT_Command_Stepper=1 // AT+RST重启模块;
const unsigned char RST[6]={"AT+RST"};
// AT_Command_Stepper=2 // 恢复出厂设置
const unsigned char RESTORE[10]={"AT+RESTORE"};
// AT_Command_Stepper=3 // AT+CWSMARTSTART=1 启动智能连接(安信可指令);
//const unsigned char CWSMARTSTART[17]={"AT+CWSMARTSTART=1"};
// AT_Command_Stepper=3 // AT+CWSTARTSMART=3 启动智能连接(乐鑫指令);
const unsigned char CWSTARTSMART[17]={"AT+CWSTARTSMART=3"};
// AT_Command_Stepper=4 // AT+CWMODE=1选择wifi应用模式1=STA,2=AP,3=AP+STA;
const unsigned char CWMODE[10] ={"AT+CWMODE="};
// AT_Command_Stepper=5 // AT+CIPMODE=0设置模块传输模式;=1透传
const unsigned char CIPMODE[11]={"AT+CIPMODE="};
// AT_Command_Stepper=6 // AT+CIPMUX=1 启动多路连接;Link id=0~4
const unsigned char CIPMUX[10] ={"AT+CIPMUX="};
// AT_Command_Stepper=7 // AT+CIFSR获取本地IP地址;
const unsigned char CIFSR[8]={"AT+CIFSR"};
// AT_Command_Stepper=8 // AT+CIPSTART=建立TCP连接或注册UDP端口号;
const unsigned char CIPSTART[12]={"AT+CIPSTART="};
// AT_Command_Stepper=9 // AT+CWSMARTSTOP 停止智能连接(安信可指令);
//const unsigned char CWSMARTSTOP[14]={"AT+CWSMARTSTOP"};
// AT_Command_Stepper=9 // AT+CWSTOPSMART 停止智能连接(乐鑫指令);
const unsigned char CWSTOPSMART[14]={"AT+CWSTOPSMART"};
// AT_Command_Stepper=10 // AT+CIPSEND =发送数据;
const unsigned char CIPSEND[11]={"AT+CIPSEND="};
// AT_Command_Stepper=11 // AT+CIPCLOSE=5关闭TCP/UDP传输;
const unsigned char CIPCLOSE[12]={"AT+CIPCLOSE="};
// AT_Command_Stepper=12 // AT+CIPSTATUS – 查询网络连接信息
const unsigned char CIPSTATUS[12]={"AT+CIPSTATUS"};
// AT_Command_Stepper=13 // AT+CIPDINFO=1 – 接收网络数据时是否提示对端IP和端口
const unsigned char CIPDINFO[12]={"AT+CIPDINFO="};
// AT_Command_Stepper=14 // 查看信息 :SDK and AT 版本;
//const unsigned char ATGMR[6]={"AT+GMR"};
// AT_Command_Stepper=15 // AT+CWJAP="SSID","PASSWORD" 加入AP;
//const unsigned char CWJAP[9]={"AT+CWJAP="};
// AT_Command_Stepper=16 // 开0/关1回显;
//const unsigned char ATE0[4]={"ATE"};
// AT_Command_Stepper=17 // 自动连接AP;
//const unsigned char CWAUTOCONN[15]={"AT+CWAUTOCONN=1"};
// AT_Command_Stepper=18 // 其他.....
//**********************************AT RETURN*******************************************
const unsigned char WIFI_CONNECTED[]="WIFI CONNECTED"; // - WiFi 已连接;
const unsigned char WIFI_GOT_IP[]="WIFI GOT IP"; // - ESP8266 station 已从 AP 获得 IP;
const unsigned char WIFI_DISCONNECT[]="WIFI DISCONNECT"; // - WiFi 连接断开;
const unsigned char Smart_get_wifi_info[]="Smart get wifi info"; // Smart Config 成功获取AP信息;
const unsigned char smarting_connected_wifi[]="smartconfig connected wifi"; // Smart Config 成功连接WIFI;
const unsigned char OK[]="OK";
const unsigned char FAIL[]="FAIL"; // AT+ CWJAP = 加入路由失败;
const unsigned char ERROR[]="ERROR";
const unsigned char ALREADY_CONNECT[]="ALREADY CONNECT"; // TCP/UDP连接已经存在
const unsigned char SEND_OK[]="SEND OK"; // AT+CIPSEND=0,n: 发送数据成功
const unsigned char plusIPD[]="+IPD,"; // 服务器发来数据开头;
const unsigned char send_logo[]="> ";
//收到CIPSEND命令后,8266先换行返回”> ”,然后开始接收串口数据=>等待本机发送数据;
const unsigned char ready[]="ready"; // 上电8266复位成功;等待状态;
const unsigned char TCP_0_CONNECT[]="0,CONNECT"; // TCP-0连接成功;
const unsigned char UDP_1_CONNECT[]="1,CONNECT"; // UDP-1连接成功;
const unsigned char TCP0_CLOSED[]="CLOSED"; // TCP/UDP连接失败;smartconfig connected wifi
const unsigned char DNS_Fail[]="DNS Fail";
const unsigned char STAMAC[]="STAMAC";
const unsigned char STAIP[]="STAIP";
const unsigned char link_is_not_valid[]="link is not valid";
//const unsigned char no_change[]="no change";
//const unsigned char OK_Linked[]="OK Linked";
//const unsigned char busy_now[]="busy now...";
//const unsigned char CONNECT_OK[]="CONNECT,OK";
//const unsigned char invalid[]="invalid";
//const unsigned char CLOSED[]="CLOSED"; // 断开 TCP/UDP 通信
//const unsigned char TCIPMUXandCIP_SERVER_mustbe0_ERROR[]="TCIPMUX and CIP SERVER must be 0 ,ERROR";
// ...............
//**********************************AT RETURN*******************************************
//**********************************AT CMD**************************************
const unsigned char Lcd_Table0123456789[10]={0xeb,0x60,0xc7,0xe5,0x6c,0xad,0xaf,0xe0,0xef,0xed};//0~9
const unsigned char lcd_day_tab[4]={0x0,0x9,0xe,0xd}; //f 0~3
const unsigned char Lcd_Hour_Tab[3]={0x0,0xa,0xc}; //e 0~2
const unsigned char lcd_shiduan_tab[4]={0x0,0x9,0x7,0xb}; //0~3
/**********************系统变量初始化************************/
void System_Init(void)
{
unsigned char len=0;
// ----------初始化:状态位;
if(flag_ScreenLock_Status)
flag0=0x10;
else
flag0=0x10;
flag1=0;
flag2=0;
flag3=0;
flag4=0;
flag5=0;
//state0=0;
flag_WiFi_ready=0;
flag_WiFi_Connected=0;
flag_WiFi_Disconnect=0;
flag_TCP0_Connected=0;
//flag_ScreenLock_Status=1; // 开机设定面板是锁定的;
flag_have_key=0;
flag_Restart_Connect_TCP=0;
flag_Enable_Connect_TCP=0;
flag_Receive_NewFrame_Buffer0=0;
flag_Receive_NewOneByte=0;
flag_WiFi_Connect_Enable=0;
//lamp2_PC5=0; // 硬件信号没有输出 DENG2(PC5)
//lamp1_PC6=0;
//UVC_PC7=0;
//LCD_backled_PC3=0;
//LCD_backled_PC3=1;
for(len=0;len<120;len++)
{
Receive_Buffer1[len]=0;
Receive_Buffer0[len]=0;
}
Connect_TCP_Counter=0;
Lcd_Colon_TimeoutCounter=0;
System_Status=0;
Key_Shake=0;
Key_Shake_Config=0;
WiFi_Disconnect_TimeoutCounter=0;
TCP0_TimeoutCounter=0;
ThreeMS_Counter=0;
Lcd_Colon_TimeoutCounter=0;
RS232_TimeoutCounter=0;
HeartBeat10s_TimeoutCounter=0;
UnLockScreen_TimeoutCounter=0;
LockScreen_TimeoutCounter=0;
NoLoginBack150s_TimeoutCounter=0;
DisConnect180s_TimeoutCounter=0;
NoWiFi5s_TimeoutCounter=0;
Receive_NewFrame_TimeoutCounter=0;
HeartBeat_0_TimeoutCounter=0;
HeartBeat_1_TimeoutCounter=0;
Receive_Num0=0;
InBuffer_ID=0;
Receive_Count0=0;
Receive_Count1=0;
Send_Num=0;
Send_Count=0;
pStr0=pStr1=NULL;
}
/* CRC余式表 */
const unsigned int crc_table[256]=
{
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
//下面函数获得CRC校验码 采用标准CRC16 初始CRC=0XFFFF 运算多项式参数 8005 非1021
unsigned int GetRevCrc_16(unsigned char * pData, int nLength)
{
unsigned int cRc_16 = 0xffff;
unsigned char temp;
while(nLength-- > 0)
{
temp = cRc_16&0xff;
cRc_16 = (cRc_16 >> 8) ^ crc_table[(temp ^ *pData++) & 0xFF];
}
return cRc_16;
}
/**********************************************/
void Delay(unsigned int delay_num) // Delay(10000)=14ms
{
unsigned int i;
for(i=0;i>1;
}
for(i=0;i<8;i++)
{
ds_clk=0;
ds_io=(byte & 0x01);
ds_clk=1;
byte=byte>>1;
}
ds_rst=0;
}
/*********************DS1302时钟芯片,读1byte**************************/
unsigned char readds1302(unsigned char address)
{
unsigned char i,byte=0;
ds_clk=0;
ds_io=1; // 读=1
address=((address<<1) | 0x81);
ds_rst=1;
for(i=0;i<8;i++)
{
ds_io=(address & 0x01);
ds_clk=1;
address=address>>1;
ds_clk=0;
}
ds_io=1;
for(i=0;i<8;i++)
{
ds_clk=0;
byte=byte>>1;
if(ds_data){byte=byte | 0x80;}
//else { byte=byte & 0x7f;}
ds_clk=1;
// nop;
// nop;
}
ds_rst=0;
return(byte);
}
/*******************读时间=》合成到数组***********************/
void Read_Time(void)
{
unsigned char temp=0;
if(flag_ClockTimeSetting==0)//&&flag_HeartBeat10s)
//if(flag_ClockTime_Change==1)
{
temp=readds1302(6);//
Disp_Year=(temp>>4)*10 + (temp & 0x0f);
temp=readds1302(5);
Disp_Week= temp & 0x07;
temp=readds1302(4);
Disp_Month=((temp & 0x10)>>4)*10 + (temp & 0x0f);
temp=readds1302(3);
Disp_Day= ((temp & 0x30)>>4)*10 + (temp & 0x0f);
temp=readds1302(2);
Disp_Hour= ((temp & 0x30)>>4)*10 + (temp & 0x0f);
temp=readds1302(1);
Disp_Minute= ((temp & 0x70)>>4)*10 + (temp & 0x0f);
temp=readds1302(0);
Disp_Second=((temp & 0x70)>>4)*10 + (temp & 0x0f);
}
}
/*******************数组=》写时间***********************/
void Write_Time(void)
{
unsigned char i;
//if(flag_ClockTimeSetting==0)//&&flag_HeartBeat10s)
//if(flag_ClockTime_Change==1)
{
flag_ClockTime_Change=0;
if(Disp_Year>99){Disp_Year=99;}
if(Disp_Month>12){Disp_Month=12;}
if(Disp_Day>31){Disp_Day=31;}
if(Disp_Hour>23){Disp_Hour=23;}
if(Disp_Minute>59){Disp_Minute=59;}
writeds1302(0x0,7);
//writeds1302(0x0,7);writeds1302(0xa5,8);
i=((Disp_Year/10)<<4) | (Disp_Year%10);
writeds1302(i,6);
i=Disp_Week&0x7;
writeds1302(i,5);
i=((Disp_Month/10)<<4) | (Disp_Month%10);
writeds1302(i,4);
i=((Disp_Day/10)<<4) | (Disp_Day%10);
writeds1302(i,3);
i=((Disp_Hour/10)<<4) | (Disp_Hour%10);
writeds1302(i,2);
i=((Disp_Minute/10)<<4) | (Disp_Minute%10);
writeds1302(i,1);
i=((Disp_Second/10)<<4) | (Disp_Second%10);
writeds1302(i,0);
writeds1302(0x80,7);
//send_pc(0x71);
}
}
/*********************HT1621,LCD送8位*************************/
void sendbit_MSBfirst(unsigned char dat,unsigned char bitcnt)
{
unsigned char i;
for(i=0;i>1;
}
}
/** HT1621,LCD送命令*12bit(3+9):100+C8C7C6C5C4C3C2C1C0 **/
void ht_writecmd(unsigned char cmd,unsigned char cmd_data)
{
ht1621_cs = 0;
sendbit_MSBfirst(cmd,4); // 0x80 = Command
sendbit_MSBfirst(cmd_data,8);
ht1621_cs = 1;
}
void BEEP_ms(unsigned int ms)
{
ht_writecmd(Command, toneon);
Delay_ms(ms);
ht_writecmd(Command, toneoff);
}
/** HT1621,LCD送数据*13bit(3+6+4):101+A5A4A3A2A1A0+D0D1D2D3 **/
void ht_writedata(unsigned char waddr,unsigned char wdata,unsigned char wnum)
{
ht1621_cs = 0;
sendbit_MSBfirst(0xa0,3); // 0xa0 = Write Data/Read-Modify-Write Data
waddr = waddr << 2;
sendbit_MSBfirst(waddr,6);
wdata = wdata << (8-wnum);
sendbit_MSBfirst(wdata,wnum);// error 反了,应该LSB first send
ht1621_cs = 1;
}
void ht_writedata_zdh(unsigned char waddr,unsigned char wdata,unsigned char wnum)
{
ht1621_cs = 0;
sendbit_MSBfirst(0xa0,3); // 0xa0 = Write Data/Read-Modify-Write Data
waddr = waddr << 2;
sendbit_MSBfirst(waddr,6);
//wdata = wdata << (8-wnum);
sendbit_LSBfirst_zdh(wdata,wnum);
ht1621_cs = 1;
}
/********************HT1621,LCD初始化***************************/
void ht1621_cmd_init(void)
{
unsigned char i;
LCD_backled_PC3=1; // LCD背灯 1=open;
ht_writecmd(Command,sysen); // 打开系统振荡器命令
ht_writecmd(Command,lcdon); // 打开LCD偏压发生器命令
ht_writecmd(Command,rc256k); // 系统时钟源片内RC振荡器命令
ht_writecmd(Command,bias); // LCD1/3偏压选项4个公共口命令
ht_writecmd(Command,tone2k); // 2k声音频率命令
for(i=0;i<32;i++)
ht_writedata(i,0x00,4);
Delay(500);
for(i=0;i<32;i++)
ht_writedata(i,0x0f,4);
// Delay(5000);
// ht_writecmd(Command, toneoff);
// Delay(50000);
// ht_writecmd(Command, toneoff);
}
/*
ht_writecmd(Command, toneon ); // 打开声音输出
ht_writecmd(Command, toneoff ); // 关闭声音输出
*/
/**********************温度显示*故障代码***********************/
void Lcd_Disp_Tempture(unsigned int Disp) //温度显示[XX:X]
{
/*
"8"字型段定义
---A--- ---A--- ---A---
| | | | | |
F B F B F B
| | | | | |
---G--- ---G--- ---G---
| | | | | |
E C E C E C
| | | | | |
---D--- ---D--- . ---D---
*/
unsigned char temp,lcd_high4,lcd_low4;
// 温度值小位数X;SEG14+SEG15
temp=Lcd_Table0123456789[Disp%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // S13="水温标记"
ht_writedata(14,lcd_high4,4); // SEG14:9A9B9C+S13
ht_writedata(15,lcd_low4,4); // SEG15:9F9G9E9D
// 温度值个位数X;SEG16+SEG17
temp=Lcd_Table0123456789[Disp%100/10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // DP="."
ht_writedata(16,lcd_high4,4); // SEG16:8A8B8C+DP
ht_writedata(17,lcd_low4,4); // SEG17:8F8G8E8D
// 温度值十位数X;SEG18+SEG19
temp=Lcd_Table0123456789[Disp/100];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // S14="Temperature"
ht_writedata(18,lcd_high4,4); // SEG18:7A7B7C+S14
ht_writedata(19,lcd_low4,4); // SEG19:7F7G7E7D
Delay_ms(250);
}
/********************读取”按键“值*************************
触键编号 B3 B2 B1 B0 备注
无有效触摸 1 1 1 1 无触摸状态
K0(=0) 0 0 0 0 0=VSS\1=VDD
K1(=1) 0 0 0 1 1
K2(=2) 0 0 1 0 2
K3(=3) 0 0 1 1 3
K4(=4) 0 1 0 0 4
K5(=5) 0 1 0 1 5
K6(=5) 0 1 1 0 6
K1+K3(=7) 0 1 1 1 7 K1、K3 同时压下
K2+K4(=8) 1 0 0 0 8 K2、K4 同时压下
K3+K5(=9) 1 0 0 1 9 K3、K5 同时压下
K4+K6(=10) 1 0 1 0 10 K4、K6 同时压下
《K1=灯光照明1》的键值=1
《K2=灯光照明2》的键值=2
《K3=杀菌冲浪》 的键值=3
《K4=调节键》 的键值=4
《K5=时段照明》 的键值=5
《K6=时间设置》 的键值=6
《K6时间设置》+ 《K4调节键》 =10
*/
unsigned char Read_Key_Num(void)
{
unsigned char temp=0;
if(B0){temp|=0x1;}
if(B1){temp|=0x2;}
if(B2){temp|=0x4;}
if(B3){temp|=0x8;}
if(temp<0xf)
{return(temp);}
else
{return(0xff);}
}
#define LOC_data 0
#define RMT_data 1
/**********************UART2-TXD************************/
void UART2_sendchar(unsigned char c)
{
while((UART2_SR & 0x80)==0x00); // 发送移位寄存器为空;
UART2_DR=c;
}
// 功能是求得一字符串str1在另一字符串str2中的首次出现的位置,
// 如果str1不在str2中,则返回-1。
// 例如'假设str1为do,str2为how do you do,则返回值为4 。
/*
int strloc(char *str2,char *str1)
{
int la=strlen(str1);// 子串;
int i,j;
int lb=strlen(str2); // 母串;
for(i=0;i>8;
Send_Buffer[19]=CRC16;
if(0xff==STR)
{
for(i=0;i<20;i++)
Send_Buffer[i]=0xff;
}
Send_Num=20;
//UART2_Send_Buffer_NoCheck(Send_Num);
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,SEND_OK))==NULL&&flag_RS232_TimeoutStart); // 等待出现"SEND OK"
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
// 打印了 "SEND OK"
flag_SEND_FAIL=0;
System_Status=11;
}
else
{
// 串口超时了
flag_SEND_FAIL=1;
flag_UDP1_Connected=0;
System_Status=10;
//Lcd_Disp_Tempture(System_Status);
}
}
}
/**********************************************/
void Heart_and_State_Return(unsigned char str) // 心跳包&状态返回
{
// 根据功能码,进行命令回复,Function_Code
unsigned char i,temp;
unsigned int CRC16 = 0xffff;
switch(Function_Code)
{
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;
case 10: break;
default:break;
}
Load_Header_15data(0,str); // str表示发放0还是回复1
i=15;
if(flag_auto_hand)
Send_Buffer[i++]=0x1;
else
Send_Buffer[i++]=0x0; // 设备当前工作模式
Send_Buffer[i++]=0x1; // 灯1: 1=on,0=off
if(flag_lamp1_onoff)
Send_Buffer[i++]=0x1;
else
Send_Buffer[i++]=0x0;
Send_Buffer[i++]=0x2; // 灯2: 1=on,0=off
if(flag_lamp2_onoff)
Send_Buffer[i++]=0x1;
else
Send_Buffer[i++]=0x0;
Send_Buffer[i++]=0x3; // 灯3: 1=on,0=off
if(flag_UVC_onoff)
Send_Buffer[i++]=0x1;
else
Send_Buffer[i++]=0x0;
// Send_Buffer[i++]=0x4; // 灯4: 1=on,0=off
// if(flag_lamp4_onoff)
// Send_Buffer[i++]=0x1;
// else
// Send_Buffer[i++]=0x0;
// Send_Buffer[i++]=0x5; // 灯5: 1=on,0=off
// if(flag_lamp5_onoff)
// Send_Buffer[i++]=0x1;
// else
// Send_Buffer[i++]=0x0;
for(temp=0;temp<6;temp++)//6个定时器
{
Send_Buffer[i++]=temp+1; // 定时器编号1~10,(1字节)
Send_Buffer[i++]=Timers_Enable[temp+1]; // 定时器开关:0关,1开(1字节)
Send_Buffer[i++]=Set_Open_Hour[temp]; // 定时时间开时;(1字节)
Send_Buffer[i++]=Set_Open_Minute[temp]; // 定时时间开分;(1字节)
Send_Buffer[i++]=Set_Close_Hour[temp]; // 定时时间关时;(1字节)
Send_Buffer[i++]=Set_Close_Minute[temp];// 定时时间关分;(1字节)
}
Send_Buffer[i++]=Real_Tempture/0x100;
Send_Buffer[i++]=Real_Tempture%0x100;//实际温度
Send_Buffer[i++]=0x0;
Send_Buffer[i++]=0x0;//PH值
Send_Buffer[i++]=0x0;
Send_Buffer[i++]=0x0;//湿度
Send_Buffer[i++]=TemptureAlam_Close_Open_Setup;
Send_Buffer[i++]=Set_Low_Tempture/0x100;
Send_Buffer[i++]=Set_Low_Tempture%0x100; // 报警温度-低
Send_Buffer[i++]=Set_High_Tempture/0x100;
Send_Buffer[i++]=Set_High_Tempture%0x100; // 报警温度-高
CRC16=GetRevCrc_16(Send_Buffer,i);
Send_Buffer[i++]=CRC16>>8;
Send_Buffer[i++]=CRC16;
Send_Num=i;
UART2_Send_Buffer_NoCheck(Send_Num);
if(0)
{
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,SEND_OK))==NULL&&flag_RS232_TimeoutStart); // 等待出现"SEND OK"
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
// 打印了 "SEND OK"
flag_SEND_FAIL=0;
System_Status=11;
}
else
{
// 串口超时了
flag_SEND_FAIL=1;
flag_TCP0_Connected=0;
System_Status=10;
//Lcd_Disp_Tempture(System_Status);
}
}
}
/*****************************************************************/
//生成右边这样的指令,将参数a_len 改成10进制,右边这条指令 "AT+CIPSEND=id,XX" XX是发送的数量
void make_AT_CIPSEND(unsigned char len,unsigned char STR,unsigned char X) // 动态构造发送AT指令
{
// len数据长度 STR=255是否UDP广播 X='0'心跳TCP返回,其他根据Link_id
unsigned char i,j,k;
for(i=0;i<11;i++)
Send_Buffer[i]=CIPSEND[i]; // 发送数据命令
Send_Buffer[i]=Link_id; // 需要用于传输连接的 id 号
// 【设备登录服务器指令(24字节)每次设备入网都会主动发送登陆指令】
if(len==24)
{
Send_Buffer[i]='0';
Send_Buffer[++i]=',';
Send_Buffer[++i]='2';
Send_Buffer[++i]='4';
}
// 回复设备入网的指令(UDP方式)(20字节)每次设备入网都会向局域网内发送一次
else if(len==20)
{
Send_Buffer[i]='1'; // UDP=1 需要用于传输连接的 id 号=1
Send_Buffer[++i]=',';
Send_Buffer[++i]='2';
Send_Buffer[++i]='0';
Send_Buffer[++i]=',';
Send_Buffer[++i]='"'; //i=16
if(STR==255)
{
// 第一次群发末端IP段:IP_buf[3]=255
//LOC_IP_buf[0]=192,LOC_IP_buf[1]=168,LOC_IP_buf[2]=61
if(LOC_IP_buf[0]/100)
{
Send_Buffer[++i]=LOC_IP_buf[0]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
}
else if((LOC_IP_buf[0]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
Send_Buffer[++i]='.';
if(LOC_IP_buf[1]/100)
{
Send_Buffer[++i]=LOC_IP_buf[1]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
}
else if((LOC_IP_buf[1]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
Send_Buffer[++i]='.';
if(LOC_IP_buf[2]/100)
{
Send_Buffer[++i]=LOC_IP_buf[2]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
}
if((LOC_IP_buf[2]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
Send_Buffer[++i]='.';
Send_Buffer[++i]='2';
Send_Buffer[++i]='5';
Send_Buffer[++i]='5';
}
else
{
// 第二次指定UDP的IP
// RMT_IP_buf[0]=192,RMT_IP_buf[1]=168,RMT_IP_buf[2]=61,RMT_IP_buf[3]=128
if(RMT_IP_buf[0]/100)
{
Send_Buffer[++i]=RMT_IP_buf[0]/100+'0';
Send_Buffer[++i]=(RMT_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[0]%10+'0';
}
else if((RMT_IP_buf[0]/10)%10)
{
Send_Buffer[++i]=(RMT_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[0]%10+'0';
}
else
Send_Buffer[++i]=RMT_IP_buf[0]%10+'0';
Send_Buffer[++i]='.';
if(RMT_IP_buf[1]/100)
{
Send_Buffer[++i]=RMT_IP_buf[1]/100+'0';
Send_Buffer[++i]=(RMT_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[1]%10+'0';
}
else if((RMT_IP_buf[1]/10)%10)
{
Send_Buffer[++i]=(RMT_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[1]%10+'0';
}
else
Send_Buffer[++i]=RMT_IP_buf[1]%10+'0';
Send_Buffer[++i]='.';
if(RMT_IP_buf[2]/100)
{
Send_Buffer[++i]=RMT_IP_buf[2]/100+'0';
Send_Buffer[++i]=(RMT_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[2]%10+'0';
}
else if((RMT_IP_buf[2]/10)%10)
{
Send_Buffer[++i]=(RMT_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[2]%10+'0';
}
else
Send_Buffer[++i]=RMT_IP_buf[2]%10+'0';
Send_Buffer[++i]='.';
if(RMT_IP_buf[3]/100)
{
Send_Buffer[++i]=RMT_IP_buf[3]/100+'0';
Send_Buffer[++i]=(RMT_IP_buf[3]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[3]%10+'0';
}
else if((RMT_IP_buf[3]/10)%10)
{
Send_Buffer[++i]=(RMT_IP_buf[3]/10)%10+'0';
Send_Buffer[++i]=RMT_IP_buf[3]%10+'0';
}
else
Send_Buffer[++i]=RMT_IP_buf[3]%10+'0';
}
Send_Buffer[++i]='"';
Send_Buffer[++i]=',';
Send_Buffer[++i]='9'; // RMT_IP_PORT
Send_Buffer[++i]='9';
Send_Buffer[++i]='5';
Send_Buffer[++i]='4';
}
// 心跳或者返回(71字节)
else if(len==71)//else if(flag_HeartBeat10s)
{
if(X=='0')
Send_Buffer[i]='0'; // 需要用于传输连接的 id 号
Send_Buffer[++i]=',';
Send_Buffer[++i]='7';
Send_Buffer[++i]='1'; // 71bytes 【设备发送心跳包(71字节,周期10秒)】
}
// 报警温度信息(22字节)
else if(len==22)//else if(flag_Tempture_Abnormal)
{
//Send_Buffer[i]='0'; // 需要用于传输连接的 id 号
Send_Buffer[++i]=',';
Send_Buffer[++i]='2';
Send_Buffer[++i]='2'; // 22bytes 温度报警【返回状态信息(22字节)】
}
Send_Buffer[++i]='\r'; // '\r'=0x0d;
Send_Buffer[++i]='\n'; // '\n'=0x0a;
Send_Num=i+1;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,send_logo))==NULL&&flag_RS232_TimeoutStart); // 等待出现"> "
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
// 打印了 "> "
flag_SEND_FAIL=0;
System_Status=211;
}
else
{
flag_SEND_FAIL=1;
if(len==20)
flag_UDP1_Connected=0;
else
flag_TCP0_Connected=0;
System_Status=210;
//Lcd_Disp_Tempture(System_Status);
}
}
#define MASS_KEY1 0xAE // flash' 秘钥1
#define MASS_KEY2 0x56 // flash' 秘钥2
#define EEP_BASE 0x4000 // eerom 起始地址
/********************STM8S内部EEPROM 初始化**************************/
void MCUeeprom_Init(void)
{
FLASH_CR1 = 0x00;
FLASH_CR2 = 0x00;
FLASH_NCR2 = 0xff;
FLASH_DUKR = MASS_KEY1;
FLASH_DUKR = MASS_KEY2;
while(!(FLASH_IAPSR & 0x08)); // 等待写保护解锁
}
/********************STM8S内部EEPROM 写1byte**************************/
void MCUeeprom_write_byte(unsigned int addr ,unsigned char dat) //不同芯片,EEPROM容量不同
{
*((unsigned char*)(addr + EEP_BASE)) = dat;
while(!(FLASH_IAPSR & 0x04)); //等待写完成
}
/********************STM8S内部EEPROM 读1byte**************************/
unsigned char MCUeeprom_read_byte(unsigned int addr)
{
return *((unsigned char*)(EEP_BASE + addr));
}
/********************STM8S内部批量写**************************/
void MCUeeprom_write_URL(void)
{
unsigned char i;
MCUeeprom_Init();
// 保存当前TCP服务器域名;
for(i=55;i<75;i++)
MCUeeprom_write_byte(i,URL_ADDR[i-55]);
}
void MCUeeprom_write(void)
{
unsigned char i;
//if(flag_LampTime_Change)
{
// flag_LampTime_Change=0;
MCUeeprom_Init();
//for(i=0;i<128;i++)
// MCUeeprom_write_byte(i,0);
for(i=0;i<10;i++)
{MCUeeprom_write_byte(i,Set_Open_Hour[i]);}
for(i=10;i<20;i++)
{MCUeeprom_write_byte(i,Set_Open_Minute[i-10]);}
for(i=20;i<30;i++)
{MCUeeprom_write_byte(i,Set_Close_Hour[i-20]);}
for(i=30;i<40;i++)
{MCUeeprom_write_byte(i,Set_Close_Minute[i-30]);}
for(i=40;i<50;i++)
{MCUeeprom_write_byte(i,Timers_Enable[i-39]);}
MCUeeprom_write_byte(50,TemptureAlam_Close_Open_Setup);
//Set_High_Tempture=0x2505;
MCUeeprom_write_byte(51,Set_High_Tempture/0x100);
MCUeeprom_write_byte(52,Set_High_Tempture%0x100);
//Set_Low_Tempture=0x1505;
MCUeeprom_write_byte(53,Set_Low_Tempture/0x100);
MCUeeprom_write_byte(54,Set_Low_Tempture%0x100);
MCUeeprom_write_byte(55,state0);
MCUeeprom_write_byte(56,flag_lamp1_onoff);
MCUeeprom_write_byte(57,flag_lamp2_onoff);
MCUeeprom_write_byte(58,flag_UVC_onoff);
MCUeeprom_write_byte(59,flag_auto_hand);
MCUeeprom_write_byte(60,Have_New_URL);
// 保存当前TCP服务器域名;
for(i=61;i<81;i++)
MCUeeprom_write_byte(i,URL_ADDR[i-61]);
}
}
/*******************STM8S内部批量读***************************/
void MCUeeprom_read(void)
{
unsigned char i,j;
unsigned int k;
if(0)
{
for(i=0;i<10;i++)
{
Set_Open_Hour[i]=0;
Set_Close_Hour[i]=0;
Set_Open_Minute[i]=0;
Set_Close_Minute[i]=0;
Timers_Enable[i+1]=0;
}
TemptureAlam_Close_Open_Setup = 0;
Set_High_Tempture = 0;
Set_High_Tempture = Set_High_Tempture*0x100;
Set_High_Tempture+= 0;
Set_Low_Tempture = 0;
Set_Low_Tempture = Set_Low_Tempture*0x100;
Set_Low_Tempture+= 0;
for(i=0;i<20;i++)
// URL_TCP0_ifish7[i]=0;
state0=0;
}
for(i=0;i<10;i++)
{Set_Open_Hour[i]=MCUeeprom_read_byte(i);}
for(i=10;i<20;i++)
{Set_Open_Minute[i-10]=MCUeeprom_read_byte(i);}
for(i=20;i<30;i++)
{Set_Close_Hour[i-20]=MCUeeprom_read_byte(i);}
for(i=30;i<40;i++)
{Set_Close_Minute[i-30]=MCUeeprom_read_byte(i);}
for(i=40;i<50;i++)
{Timers_Enable[i-39]=MCUeeprom_read_byte(i);}
TemptureAlam_Close_Open_Setup = MCUeeprom_read_byte(50);
i = MCUeeprom_read_byte(51);
j = MCUeeprom_read_byte(52);
Set_High_Tempture = i*0x100+j;
i = MCUeeprom_read_byte(53);
j = MCUeeprom_read_byte(54);
Set_Low_Tempture = i*0x100+j;
// 读取当前TCP服务器域名;(避免第一次读出来是空的)
/*
for(i=55;i<75;i++)
k+=MCUeeprom_read_byte(i);
if(k==0||k==20*0xff)
{}
else
{
for(i=55;i<75;i++)
URL_ADDR[i-55]=MCUeeprom_read_byte(i);
}
*/
state0=MCUeeprom_read_byte(55);
flag_lamp1_onoff=MCUeeprom_read_byte(56);
flag_lamp2_onoff=MCUeeprom_read_byte(57);
flag_UVC_onoff=MCUeeprom_read_byte(58);
flag_auto_hand=MCUeeprom_read_byte(59);
Have_New_URL=MCUeeprom_read_byte(60);
flag_lamp1_onoff&=0x01;
flag_lamp2_onoff&=0x01;
flag_UVC_onoff&=0x01;
flag_auto_hand&=0x01;
if(0xea==Have_New_URL)
{
for(i=61;i<81;i++)
URL_ADDR[i-61]=MCUeeprom_read_byte(i);
}
}
/***********************解析读取MAC和IP***********************/
const unsigned char test_IPMAC[]={'A','T','+','C','I','P','F','S','R','\r',
'+','C','I','P','F','S','R',':','S','T',
'A','I','P',',','"','1','9','2','.','1',
'6','8','.','0','.','1','0','8','"','\r','+',
'C','I','P','F','S','R',':','S','T','A',
'M','A','C',',','"','1','8',':','f','e',
':','3','4',':','d','b',':','0','d',':',
'3','3','"','\r','\n','O','K'};
//AT+CIPFSR 字符串转数字
//+CIFSR:STAIP,"192.168.0.108"
//+CIFSR:STAMAC,"18:fe:34:db:0d:33"
//OK
void Read_STAIP_STAMAC(void)
{
unsigned char temp,i,i_temp;
//for(i=0;i<100;i++)
// Receive_Buffer1[i]=test_IPMAC[i];
if((pStr1=strstr(Receive_Buffer1,STAIP))!=NULL);
{
LOC_IP_buf[0]=LOC_IP_buf[1]=LOC_IP_buf[2]=LOC_IP_buf[3]=0;
flag_Have_STAIP=1;
temp=strloc(Receive_Buffer1,STAIP); // (strstr(Receive_Buffer1,ready)==NULL);
temp=temp+7;
for(i=0;i<10;i++)
{
if(Receive_Buffer1[temp+i]=='.')
break;
}
if(i==1)
LOC_IP_buf[0]=(Receive_Buffer1[temp]-'0');
else if(i==2)
LOC_IP_buf[0]=(Receive_Buffer1[temp]-'0')*10 +(Receive_Buffer1[temp+1]-'0');
else if(i==3)
LOC_IP_buf[0]=(Receive_Buffer1[temp]-'0')*100+(Receive_Buffer1[temp+1]-'0')*10+(Receive_Buffer1[temp+2]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer1[temp+i]=='.')
break;
}
if(i==1)
LOC_IP_buf[1]=(Receive_Buffer1[temp]-'0');
else if(i==2)
LOC_IP_buf[1]=(Receive_Buffer1[temp]-'0')*10+(Receive_Buffer1[temp+1]-'0');
else if(i==3)
LOC_IP_buf[1]=(Receive_Buffer1[temp]-'0')*100+(Receive_Buffer1[temp+1]-'0')*10+(Receive_Buffer1[temp+2]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer1[temp+i]=='.')
break;
}
if(i==1)
LOC_IP_buf[2]=(Receive_Buffer1[temp+i-1]-'0');
else if(i==2)
LOC_IP_buf[2]=(Receive_Buffer1[temp+i-2]-'0')*10+(Receive_Buffer1[temp+i-1]-'0');
else if(i==3)
LOC_IP_buf[2]=(Receive_Buffer1[temp+i-3]-'0')*100+(Receive_Buffer1[temp+i-2]-'0')*10+(Receive_Buffer1[temp+i-1]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer1[temp+i]=='"')
break;
}
if(i==1)
LOC_IP_buf[3]=(Receive_Buffer1[temp+i-1]-'0');
else if(i==2)
LOC_IP_buf[3]=(Receive_Buffer1[temp+i-2]-'0')*10+(Receive_Buffer1[temp+i-1]-'0');
else if(i==3)
LOC_IP_buf[3]=(Receive_Buffer1[temp+i-3]-'0')*100+(Receive_Buffer1[temp+i-2]-'0')*10+(Receive_Buffer1[temp+i-1]-'0');
temp=temp+i+1;
}
//AT+CIPFSR\r 字符串转数字
//+CIFSR:STAIP,"192.168.1.104"\r
//+CIFSR:STAMAC,"5c:cf:7f:07:65:21"\r\n
//OK
if((pStr1=strstr(Receive_Buffer1,STAMAC))!=NULL) // >='a',<='f'
{
LOC_MAC_buf[0]=LOC_MAC_buf[1]=LOC_MAC_buf[2]=LOC_MAC_buf[3]=LOC_MAC_buf[4]=LOC_MAC_buf[5]=0;
flag_Have_STAMAC=1;
temp=strloc(Receive_Buffer1,STAMAC);
temp=temp+8;
for(i=0;i<6;i++)
{
if(Receive_Buffer1[temp]>='0'&&Receive_Buffer1[temp]<='9')
LOC_MAC_buf[i]=(Receive_Buffer1[temp]-'0');
if(Receive_Buffer1[temp]>='a'&&Receive_Buffer1[temp]<='f')
LOC_MAC_buf[i]=(Receive_Buffer1[temp]-'a')+10;
if(Receive_Buffer1[temp+1]>='0'&&Receive_Buffer1[temp+1]<='9')
LOC_MAC_buf[i]=LOC_MAC_buf[i]*16+(Receive_Buffer1[temp+1]-'0');
if(Receive_Buffer1[temp+1]>='a'&&Receive_Buffer1[temp]<='f')
LOC_MAC_buf[i]=LOC_MAC_buf[i]*16+(Receive_Buffer1[temp+1]-'a')+10;
temp=temp+3;
}
}
}
/*********************看门狗复位************************/
/**
* @brief Enables IWDG. "stm8s_iwdg.h"
* @param None
* @retval None
*/
void IWDG_Enable(void)
{
IWDG_KR = 0xcc; //IWDG_KEY_ENABLE;
}
/**********************模块复位************************/
void ESP8266_RST(void)
{
unsigned char i;
System_Init();
for(i=0;i<6;i++)
Send_Buffer[i]=RST[i];
Send_Buffer[6]='\r';
Send_Buffer[7]='\n';
Send_Num=8;
UART2_Send_Buffer_NoCheck(Send_Num);
// Monitoring
//Delay_ms(1000);
//BEEP_ms(200);
}
/********************模块出厂设置**********************/
void ESP8266_RESTORE(void)
{
unsigned char i;
for(i=0;i<10;i++)
Send_Buffer[i]=RESTORE[i];
Send_Buffer[10]='\r';
Send_Buffer[11]='\n';
Send_Num=12;
UART2_Send_Buffer_NoCheck(Send_Num);
// Monitoring
//Delay_ms(1000);
BEEP_ms(200);
}
/**********************ESP8266模块设置************************/
void ESP8266_CWMODE(unsigned char STR)
{
unsigned char i;
// 1-1.AT+CWMODE=1 station
for(i=0;i<10;i++)
Send_Buffer[i]=CWMODE[i];
Send_Buffer[10]=STR;
Send_Buffer[11]='\r';
Send_Buffer[12]='\n';
Send_Num=13;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);// 等待返回 OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
System_Status=41;
else
System_Status=40;
//Lcd_Disp_Tempture(System_Status);
}
/**********************ESP8266普通/透传模式************************/
void ESP8266_CIPMODE(unsigned char STR)
{
unsigned char i;
// 1-2.AT+CIPMODE=0 非透传,普通模式
for(i=0;i<11;i++)
Send_Buffer[i]=CIPMODE[i];
Send_Buffer[11]=STR;
Send_Buffer[12]='\r';
Send_Buffer[13]='\n';
Send_Num=14;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);// 等待返回 OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL) System_Status=51;
else System_Status=50;
//Lcd_Disp_Tempture(System_Status);
}
/**********************ESP8266多路连接************************/
void ESP8266_CIPMUX(unsigned char STR)
{
unsigned char i;
// 1-3.AT+CIPMUX=1 多路连接
for(i=0;i<10;i++)
Send_Buffer[i]=CIPMUX[i];
Send_Buffer[10]=STR;
Send_Buffer[11]='\r';
Send_Buffer[12]='\n';
Send_Num=13;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);// 等待返回 OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL) System_Status=61;
else System_Status=60;
//Lcd_Disp_Tempture(System_Status);
}
/**********************ESP8266显示对端IP和端口************************/
void ESP8266_CIPDINFO(unsigned char STR)
{
unsigned char i;
// 1-4.AT+CIPDINFO=1 显示对端IP和端口
for(i=0;i<12;i++)
Send_Buffer[i]=CIPDINFO[i];
Send_Buffer[i++]=STR;
Send_Buffer[i++]='\r';
Send_Buffer[i++]='\n';
Send_Num=i;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);// 等待返回 OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL) System_Status=61;
else System_Status=60;
//Lcd_Disp_Tempture(System_Status);
}
/**********************ESP8266关闭连接************************/
void ESP8266_CIPCLOSE(unsigned char STR)
{
unsigned char i;
// 1-5.AT+CIPCLOSE=0~4,5=关闭所有 TCP/UDP 传输
for(i=0;i<12;i++)
Send_Buffer[i]=CIPCLOSE[i];
Send_Buffer[12]=STR; //STR=id
Send_Buffer[13]='\r';
Send_Buffer[14]='\n';
Send_Num=15;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL) System_Status=141;
else System_Status=140;
//Lcd_Disp_Tempture(System_Status);
}
/**********************ESP8266智能启动************************/
void ESP8266_STARTSMART(void)
{
unsigned char i;
flag_WiFi_Smarting=1;
flag_WiFi_Connect_Enable=1;
flag_WiFi_Disconnect=0;
flag_WiFi_Connected=0;
flag_TCP0_Connected=0;
if(flag_WiFi_Connected==0)
{
for(i=0;i<14;i++)
Send_Buffer[i]=CWSTOPSMART[i];
Send_Buffer[14]='\r';
Send_Buffer[15]='\n';
Send_Num=16;
UART2_Send_Buffer_Check(Send_Num);// 智能连接先关一下
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);// 等待返回 OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL) System_Status=71;
else System_Status=70;
//Lcd_Disp_Tempture(System_Status);
for(i=0;i<17;i++)
Send_Buffer[i]=CWSTARTSMART[i];// 智能连接
Send_Buffer[17]='\r';
Send_Buffer[18]='\n';
Send_Num=19;
flag_WiFi_Connected=0;
UART2_Send_Buffer_NoCheck(Send_Num);
// Monitoring
}
}
/**********************模块获取MAC和IP************************/
void ESP8266_CIFSR(void)
{
unsigned char i;
// 在此发送:"AT+CIFSR" / ESP8266 station IP 需连上 AP 后,才可以查询。
for(i=0;i<8;i++)
Send_Buffer[i]=CIFSR[i];
Send_Buffer[8]='\r';
Send_Buffer[9]='\n';
Send_Num=10;
UART2_Send_Buffer_Check(Send_Num);
Delay_ms(10);
while(((pStr1=strstr(Receive_Buffer1,STAIP))==NULL)&&\
((pStr1=strstr(Receive_Buffer1,STAMAC))==NULL)&&flag_RS232_TimeoutStart);
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
Read_STAIP_STAMAC();
System_Status=131;
}
else
System_Status=130;
//Lcd_Disp_Tempture(System_Status);
}
/**********************模块连接服务器*UDP1***********************/
void ESP8266_CIPSTART_UDP(unsigned char STR)
{
unsigned char i,j;
if(1)//if(STR==1)
{
for(i=0;i<12;i++) // AT+CIPSTART=1,"UDP",“IP0.IP1.IP2.255”,9954,333,0
Send_Buffer[i]=CIPSTART[i];
Send_Buffer[12]=STR;
Send_Buffer[13]=',';
Send_Buffer[14]='"';
Send_Buffer[15]='U';
Send_Buffer[16]='D';
Send_Buffer[17]='P';
Send_Buffer[18]='"';
Send_Buffer[19]=',';
Send_Buffer[20]='"';
i=20;
if(LOC_IP_buf[0]/100)
{
Send_Buffer[++i]=LOC_IP_buf[0]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
}
else if((LOC_IP_buf[0]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[0]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[0]%10+'0';
Send_Buffer[++i]='.';
if(LOC_IP_buf[1]/100)
{
Send_Buffer[++i]=LOC_IP_buf[1]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
}
else if((LOC_IP_buf[1]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[1]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[1]%10+'0';
Send_Buffer[++i]='.';
if(LOC_IP_buf[2]/100)
{
Send_Buffer[++i]=LOC_IP_buf[2]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
}
else if((LOC_IP_buf[2]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[2]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[2]%10+'0';
Send_Buffer[++i]='.';
if(LOC_IP_buf[3]/100)
{
Send_Buffer[++i]=LOC_IP_buf[3]/100+'0';
Send_Buffer[++i]=(LOC_IP_buf[3]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[3]%10+'0';
}
else if((LOC_IP_buf[3]/10)%10)
{
Send_Buffer[++i]=(LOC_IP_buf[3]/10)%10+'0';
Send_Buffer[++i]=LOC_IP_buf[3]%10+'0';
}
else
Send_Buffer[++i]=LOC_IP_buf[3]%10+'0';
i++;
Send_Buffer[i++]='"';
Send_Buffer[i++]=',';
Send_Buffer[i++]='9';
Send_Buffer[i++]='9';
Send_Buffer[i++]='5';
Send_Buffer[i++]='4';
Send_Buffer[i++]=',';
Send_Buffer[i++]='3';
Send_Buffer[i++]='3';
Send_Buffer[i++]='3';
Send_Buffer[i++]=',';
Send_Buffer[i++]='0';
Send_Buffer[i++]='\r'; // '\r'=0x0d;
Send_Buffer[i++]='\n'; // '\n'=0x0a;
Send_Num=i;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,OK))==NULL&&flag_RS232_TimeoutStart);
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
make_AT_CIPSEND(20,255,255); // AT+CIPSEND=1,20,全网群发
UDP1_Return(11);
// 完整通讯结束。。。
}
}
/**********************模块连接服务器*TCP0***********************/
void ESP8266_CIPSTART_TCP(unsigned char STR)
{
unsigned char i,j;
if(1)//if(STR==1) // 方式一,组合再发
{
for(i=0;i<12;i++) //AT+CIPSTART=0,"TCP","192.168.61.128",9955
Send_Buffer[i]=CIPSTART[i];
Send_Buffer[12]=STR;
Send_Buffer[13]=',';
Send_Buffer[14]='"';
Send_Buffer[15]='T';
Send_Buffer[16]='C';
Send_Buffer[17]='P';
Send_Buffer[18]='"';
Send_Buffer[19]=',';
Send_Buffer[20]='"';
for(j=0;j<20;j++)
{
if(URL_ADDR[j]==0)
break;
}
if(j>10)
{
for(i=21;i<(j+21);i++)
Send_Buffer[i]=URL_ADDR[i-21];
Send_Buffer[i++]='"';
Send_Buffer[i++]=',';
Send_Buffer[i++]='9';
Send_Buffer[i++]='9';
Send_Buffer[i++]='5';
Send_Buffer[i++]='5';
Send_Buffer[i++]='\r'; // '\r'=0x0d;
Send_Buffer[i++]='\n'; // '\n'=0x0a;
Send_Num=i;
UART2_Send_Buffer_NoCheck(Send_Num);
}
}
/*
else if(STR==2) // 方式二,固定直发
{
for(i=0;i<12;i++)
Send_Buffer[i]=CIPSTART[i];
for(i=12;i<40;i++)
{
//Send_Buffer[i]=URL_TCP0_LOC104[i-12];//i<40 0,"TCP","192.168.0.104",8080 28
//Send_Buffer[i]=URL_TCP0_LOC128[i-12]; //i<41 0,"TCP","192.168.61.128",9955 29
Send_Buffer[i]=URL_TCP0_ifish7[i-12]; //i<40 0,"TCP","120.55.190.56",9955 28
}
Send_Buffer[i++]='\r'; // '\r'=0x0d;
Send_Buffer[i++]='\n'; // '\n'=0x0a;
Send_Num=i;
UART2_Send_Buffer_NoCheck(Send_Num);
}
*/
}
/**********************LCD显示刷新*********SEG0~SEG31***************/
void Lcd_Display(void)
{
/*
"8"字型段定义 col
---A--- ---A--- ---A--- ---A---
| | | | | | | |
F B F B . F B F B
| | | | | | | |
---G--- ---G--- ---G--- ---G---
| | | | | | | |
E C E C . E C E C
| | | | | | | |
---D--- ---D--- ---D--- ---D---
*/
unsigned char temp,lcd_high4,lcd_low4;
/*
ClockTimeSetup_Stepper 时钟设置:(当前北京时间设置)
1. 年十位
2. 年个位
3. 月十位
4. 月个位
5. 日十位
6. 日个位
7. 时十位
8. 时个位
9. 分十位
10.分个位
*/
// 时间小时个位值;SEG0+SEG8-8:
if(flag_LampTimeSetting)
{
if(flag_TimeSetup_Jump)
temp=0x0;
else if(flag_Open_Time)
temp=Lcd_Table0123456789[Set_Open_Hour[(LampTimeSetup_Stepper-1)/2]%10];
else if(flag_Close_Time)
temp=Lcd_Table0123456789[Set_Close_Hour[(LampTimeSetup_Stepper-1)/2]%10];
}
else if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==8)
temp=0x0;
else
temp=Lcd_Table0123456789[Disp_Hour%10];
}
else
temp=Lcd_Table0123456789[Disp_Hour%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
if(flag_Colon_Jump){lcd_high4=lcd_high4|0x1;} // COL标记“:”,跳闪
ht_writedata(0,lcd_high4,4); // SEG0:11A11B11C+COL
ht_writedata(8,lcd_low4,4); // SEG8:11F11G11E11D
// 时间分钟十位值;SEG2+SEG1-8
if(flag_LampTimeSetting)
{
if(flag_TimeSetup_Jump)
temp=0x0;
else if(flag_Open_Time)
temp=Lcd_Table0123456789[Set_Open_Minute[(LampTimeSetup_Stepper-1)/2]/10];
else if(flag_Close_Time)
temp=Lcd_Table0123456789[Set_Close_Minute[(LampTimeSetup_Stepper-1)/2]/10];
}
else if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==9)
temp=0x0;
else
temp=Lcd_Table0123456789[Disp_Minute/10];
}
else
temp=Lcd_Table0123456789[Disp_Minute/10];
lcd_high4=(temp&0xf0)>>4;
if(flag_LampTimeSetting){lcd_high4=lcd_high4|0x1;} // S17="时段"
lcd_low4=temp&0xf;
ht_writedata(2,lcd_high4,4); // SEG2:11A11B11C+COL
ht_writedata(1,lcd_low4,4); // SEG1:11A11B11C+COL
// 时间分钟个位值;SEG4+SEG3-8:
if(flag_LampTimeSetting)
{
if(flag_TimeSetup_Jump)
temp=0x0;
else if(flag_Open_Time)
temp=Lcd_Table0123456789[Set_Open_Minute[(LampTimeSetup_Stepper-1)/2]%10];
else if(flag_Close_Time)
temp=Lcd_Table0123456789[Set_Close_Minute[(LampTimeSetup_Stepper-1)/2]%10];
}
else if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==10)
temp=0x0;
else
temp=Lcd_Table0123456789[Disp_Minute%10];
}
else
temp=Lcd_Table0123456789[Disp_Minute%10];
lcd_high4=(temp&0xf0)>>4;
if(flag_LampTimeSetting){lcd_high4=lcd_high4|0x1;} // S18=时段的":"
lcd_low4=temp&0xf;
ht_writedata(4,lcd_high4,4);// SEG4:13A13B13C+S18
ht_writedata(3,lcd_low4,4); // SEG3:13F13G13E13D
// 灯光照明2LOGO: S24=lamp2-1左三点闪, S25=lamp2-2中三点闪, S26=lamp2-3右三点闪, S27=lamp2-0内心:SEG5
if(flag_lamp2_onoff)
{
lcd_low4=0x1;
if(Lcd_Colon_TimeoutCounter>1&&Lcd_Colon_TimeoutCounter<5)
{lcd_low4=lcd_low4|0x8;}
if(Lcd_Colon_TimeoutCounter>2&&Lcd_Colon_TimeoutCounter<5)
{lcd_low4=lcd_low4|0x4;}
if(Lcd_Colon_TimeoutCounter>3&&Lcd_Colon_TimeoutCounter<5)
{lcd_low4=lcd_low4|0x2;}
}
else
{lcd_low4=0xf;}
if(Key_Back==Lamp2_Key2)
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x00;
}
ht_writedata(5,lcd_low4,4); // SEG5:S24+S25+S26+S27
// 灯光照明1LOGO: S29=lamp1-1左三点闪, S30=lamp1-2中三点闪, S31=lamp1-3右三点闪, S32=lamp1-0内心 SEG6
if(flag_lamp1_onoff)
{
lcd_low4=0x1;
if(Lcd_Colon_TimeoutCounter>1&&Lcd_Colon_TimeoutCounter<5)
lcd_low4=lcd_low4|0x8;
if(Lcd_Colon_TimeoutCounter>2&&Lcd_Colon_TimeoutCounter<5)
lcd_low4=lcd_low4|0x4;
if(Lcd_Colon_TimeoutCounter>3&&Lcd_Colon_TimeoutCounter<5)
lcd_low4=lcd_low4|0x2;
}
else
{lcd_low4=0x0f;}
if(Key_Back==Lamp1_Key1)
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x00;
}
ht_writedata(6,lcd_low4,4); // SEG6:S29+S30+S31+S32
// 灯光照明1,右弧, ,灯光照明2
lcd_low4=0xf;
ht_writedata(7,lcd_low4,4); // SEG7:S28+S33+ +S23
// 时间小时十位值;SEG9
if(flag_LampTimeSetting)
{
if(flag_TimeSetup_Jump)
temp=0x0;
else if(flag_Open_Time)
temp=Lcd_Hour_Tab[Set_Open_Hour[(LampTimeSetup_Stepper-1)/2]/10];
else if(flag_Close_Time)
temp=Lcd_Hour_Tab[Set_Close_Hour[(LampTimeSetup_Stepper-1)/2]/10];
}
else if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==7)
{temp=0x0;}
else
{temp=Lcd_Hour_Tab[Disp_Hour/10];}
}
else
{temp=Lcd_Hour_Tab[Disp_Hour/10];}
lcd_low4=temp&0xf;
if(flag_LampTimeSetting){lcd_low4=lcd_low4|0x1;} //S16="时段"
ht_writedata(9,lcd_low4,4); // SEG9:10B(10AGED)10C+S16
/*
LampTimeSetup_Stepper 时段设置:lamp1,lamp2,UV-C
1.lamp1(1时段):1 开 定时器0-开 Set_Open_Hour + Set_Open_Minute
2. 1 关 定时器0-关 Set_Close_Hour+ Set_Close_Minute
3. 2 开 定时器1-开
4. 2 关 定时器1-关
5.lamp2(2时段):1 开 定时器2-开
6. 1 关 定时器2-关
7. 2 开 定时器3-开
8. 2 关 定时器3-关
9.UV-C(3时段): 1 开 定时器4-开
10. 1 关 定时器4-关
11. 2 开 定时器5-开
12. 2 关 定时器5-关
定时器6~定时器9 备用
*/
// "几"时段:SEG10
lcd_low4=0;
if(flag_LampTimeSetting)
{
if(LampTimeSetup_Stepper>=1&&LampTimeSetup_Stepper<=4)
lcd_low4=lcd_shiduan_tab[1];
else if(LampTimeSetup_Stepper>=5&&LampTimeSetup_Stepper<=8)
lcd_low4=lcd_shiduan_tab[2];
else if(LampTimeSetup_Stepper>=9&&LampTimeSetup_Stepper<=12)
lcd_low4=lcd_shiduan_tab[3];
}
ht_writedata(10,lcd_low4,4); // SEG10:14C14E(14AGD)14B
// "几"开关:SEG11,
lcd_low4=0;
if(flag_LampTimeSetting)
{
switch(LampTimeSetup_Stepper)
{
case 1: lcd_low4=lcd_shiduan_tab[1];
case 2: lcd_low4=lcd_shiduan_tab[1];
case 5: lcd_low4=lcd_shiduan_tab[1];
case 6: lcd_low4=lcd_shiduan_tab[1];
case 9: lcd_low4=lcd_shiduan_tab[1];
case 10: lcd_low4=lcd_shiduan_tab[1];
break;
case 3: lcd_low4=lcd_shiduan_tab[2];
case 4: lcd_low4=lcd_shiduan_tab[2];
case 7: lcd_low4=lcd_shiduan_tab[2];
case 8: lcd_low4=lcd_shiduan_tab[2];
case 11: lcd_low4=lcd_shiduan_tab[2];
case 12: lcd_low4=lcd_shiduan_tab[2];
break;
default:break;
}
}
ht_writedata(11,lcd_low4,4); // SEG11:15C15E(15AGD)15B
// S22=冲浪杀菌LOGO,S21=冲浪杀菌,S19=开,S20=关:SEG12
lcd_low4=0x4;
if(Lcd_Colon_TimeoutCounter<3&&flag_UVC_onoff)
{}
else
lcd_low4=lcd_low4|0x8;
if(flag_LampTimeSetting)
{
if(flag_Open_Time)
lcd_low4|=0x2;
else if(flag_Close_Time)
lcd_low4|=0x1;
}
ht_writedata(12,lcd_low4,4); // SEG12:S22+S21+S19+S20
// LL=仪表盘,S12=“℃”,S15=下弧,S10=调节键LOGO
lcd_low4=0xe;
if(Key_Back==Adjust_Key4&&flag_TimeSetup_Jump){}
else{lcd_low4=lcd_low4|0x1;}
ht_writedata(13,lcd_low4,4); // SEG13:LL+S12+S15+S10
// 温度值小位数X;SEG14+SEG15
temp=Lcd_Table0123456789[Real_Tempture%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // S13="水温标记"
ht_writedata(14,lcd_high4,4); // SEG14:9A9B9C+S13
ht_writedata(15,lcd_low4,4); // SEG15:9F9G9E9D
// 温度值个位数X;SEG16+SEG17
temp=Lcd_Table0123456789[Real_Tempture%100/10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // DP="."
ht_writedata(16,lcd_high4,4); // SEG16:8A8B8C+DP
ht_writedata(17,lcd_low4,4); // SEG17:8F8G8E8D
// 温度值十位数X;SEG18+SEG19
temp=Lcd_Table0123456789[Real_Tempture/100];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // S14="Temperature"
ht_writedata(18,lcd_high4,4); // SEG18:7A7B7C+S14
ht_writedata(19,lcd_low4,4); // SEG19:7F7G7E7D
// S4=自动,S3=手动,S2=锁LOGO,S9=调节键:SEG20
lcd_low4=0x1;
if(flag_ScreenLock_Status){lcd_low4|=0x2;} // S2=锁LOGO
if(flag_auto_hand){lcd_low4|=0x8;}else{lcd_low4|=0x4;}
ht_writedata(20,lcd_low4,4); // SEG20:S4+S3+S2+S9
// 日显示 "个" 位数:SEG21+SEG22 zhang
if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==6)
temp=0x00;
else
{temp=Lcd_Table0123456789[Disp_Day%10];}
}
else
{temp=Lcd_Table0123456789[Disp_Day%10];}
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
if(flag_TimeSetup_Jump&&flag_LampTimeSetting&&LampTimeSetup_Stepper!=0){}
else lcd_high4=lcd_high4|0x1; // S8="时段照明LOGO"
ht_writedata(21,lcd_high4,4); // SEG21:6A6B6C+S8
ht_writedata(22,lcd_low4,4); // SEG22:6F6G6E6D
// 日显示 "十" 位数:SEG23
if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==5)
{temp=0x00;}
else
{temp=lcd_day_tab[Disp_Day/10];}
}
else
{temp=lcd_day_tab[Disp_Day/10];}
lcd_low4=temp&0xf;
ht_writedata(23,lcd_low4,4); // SEG23:5B(5AGD)5E5C
// 月份显示 "个" 位数:SEG24+SEG25
if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==4)
temp=0x00;
else
temp=Lcd_Table0123456789[Disp_Month%10];
}
else
temp=Lcd_Table0123456789[Disp_Month%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1;
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==3)
lcd_high4=lcd_high4&0xe; // 3B:长显示月十的"|"=1,"[|"=0
ht_writedata(24,lcd_high4,4); // SEG24:4A4B4C+3B
ht_writedata(25,lcd_low4,4); // SEG25:4F4G4E4D
// 年份显示 "十" 位数:SEG28+SEG29
if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==1)
temp=0x00;
else
temp=Lcd_Table0123456789[Disp_Year/10];
}
else
temp=Lcd_Table0123456789[Disp_Year/10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4=lcd_high4|0x1; // S1="20 - - "
ht_writedata(28,lcd_high4,4); // SEG28:1A1B1C+S1
ht_writedata(29,lcd_low4,4); // SEG29:1F1G1E1D
// 年份显示 "个" 位数:SEG26+SEG27
if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==2)
temp=0x00;
else
temp=Lcd_Table0123456789[Disp_Year%10];
}
else
temp=Lcd_Table0123456789[Disp_Year%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
lcd_high4|=0x01;
if(Disp_Month<10)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==3)
lcd_high4&=0x0e;
else
lcd_high4|=0x01; // 3A:月十的"["
}
else
{
lcd_high4&=0x0e;
}
ht_writedata(26,lcd_high4,4); // SEG26:2A2B2C+3A
ht_writedata(27,lcd_low4,4); // SEG27:2F2G2E2D
// K1=”()”,K2=”( )”,K3=”( )”=>router ,WiFi=“WiFi”=>server :SEG30
lcd_low4=0x00;
if((flag_WiFi_ready&&flag_WiFi_Connect_Enable))
{
if(flag_WiFi_Disconnect) // 仅“((( )))”闪
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x01;
}
else if(flag_WiFi_Smarting) // 全闪(((WIFI)))
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x00;
}
else if(flag_WiFi_Connected==0) // 仅“((( )))”闪
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x01;
}
else if(flag_TCP0_Connected==0) // 仅“WIFI”闪
{
if(flag_Colon_Jump)
lcd_low4=0x0f;
else
lcd_low4=0x0e;
}
else if(flag_WiFi_Connected&&flag_TCP0_Connected) // 不闪
{
lcd_low4=0x0f;
}
}
ht_writedata(30,lcd_low4,4); // SEG30:K1+K2+K3+WiFi:"(((WiFi)))"
// S5=时间设置,S6=时间设置LOGO,S11=左弧,S7=时段照明
lcd_low4=0x0f; // 1011
if(flag_TimeSetup_Jump&&flag_ClockTimeSetting&&ClockTimeSetup_Stepper!=0)
{lcd_low4=lcd_low4&0x0b;}
ht_writedata(31,lcd_low4,4); // SEG31:S5+S6+S11+S7
}
/**********************模块组合键配置************************/
void ESP8266_CombineKey(void)
{
unsigned char i,key_use;
unsigned int disp;
if(flag_ScreenLock_Status==0)
{
key_use=Read_Key_Num(); // 读组合键值
if(Key_Back_Config==key_use&&Key_Back_Config!=0xff) // 上一次键值
{
if(++Key_Shake_Config>=25) // 去键抖动25
{
Key_Shake_Config=0;
// ***********************组合键************************
if((flag_LampTimeSetting==0)&&(flag_ClockTimeSetting==0))
{
if(key_use==Adjust_Key4)
{
while(key_use==Adjust_Key4) // 等待组合键
{
key_use=Read_Key_Num();
Delay_ms(10);
Lcd_Display();
}
ht_writecmd(Command, toneon);
Delay_ms(500);
ht_writecmd(Command, toneoff);
System_Status=171;
//Lcd_Disp_Tempture(System_Status=171);
}
}
// *****************************************************
//* 《K4=调节键》+《K6=时间设置》;出厂设置=>重新配网K4+K6(=10)
if(key_use==K4K6)
{
System_Init();
ESP8266_RESTORE();
}
//* 《K2=灯光照明2》+《K4=调节键》:模块复位,K2+K4(=8)
else if(key_use==K2K4)
{
//System_Init();
//ESP8266_RST();
}
}
}
else // 去键抖动 or 没有按键的情况下:
{
Key_Shake_Config=0;
Key_Back_Config=key_use;
flag_have_key=0;
}
}
}
/*********************温度表查*************************/
const float tempture_tab[]=
{
34.467,32.946,31.508,30.147,28.835,
27.606,26.427,25.308,24.236,23.218,22.259,21.331,20.450,19.621,18.819,
18.018,17.322,16.641,15.968,15.337,14.750,14.615,13.618,13.081,12.581,
12.110,11.647,11.210,10.786,10.386,10.000,9.631,9.277,8.937,8.613,
8.302,8.003,7.718,7.445,7.182,6.929,6.688,6.457,6.233,6.019,
5.813,5.616,5.427,5.244,5.069,4.901,4.740,4.582,4.435,4.288,
4.151,4.016,3.880,3.764,3.644,3.527,3.416,3.308,3.205,3.106,
3.011,2.919,2.830,2.744,2.662,2.583,2.504,2.430,2.359,2.289,
2.224,2.158,2.096,2.036,1.978,1.921,1.867,1.814,1.764,1.714,
1.667,1.621,1.576,1.533,1.492,1.451,1.412,1.374,1.338,1.302,
1.268,1.235,1.203,1.171,1.141,1.112,1.083,1.056,1.029,1.003,0.9777
};
float cha_biao(float tem_num)
{
float temp;
unsigned char i;
for(i=0;i<106;i++)
{
if(tem_num>tempture_tab[i])
{break;}
}
if(i>=105)
{temp=99.9;}
else if(i<=5)
{temp=0;}
else
{temp=(tempture_tab[i-1]-tem_num)/(tempture_tab[i-1]-tempture_tab[i])-5-1+i;}
return(temp);
}
/*********************AD读温度值*************************/
float ADC_DATA=0;
void Read_Tempture(void)
{
float TEMP;
//static float ADC_DATA;
/*
if((ADC_CSR & 0x80) == 0x80)
{
//ADC_DATA=ADC_DATA>>2;
temp=10*(float)ADC_DRH/(0x100-(float)ADC_DRH);
// temp=10*(float)(ADC_DATA/(0x100-ADC_DATA));
temp=cha_biao(temp);
tempture_temp=tempture_temp+temp;
if(++Tempture_Read_Counter>39)
{
Tempture_Read_Counter=0;
Real_Tempture=(((int)tempture_temp>>2)+Real_Tempture)>>1;
tempture_temp=0;
}
ADC_CSR&=0x7f; //清转换结束标志
ADC_CR1|=0x01; // 再次将CR1寄存器的最低位置1//启动ad转换
}
*/
if((ADC_CSR & 0x80) == 0x80)
{
//ADC_DATA=ADC_DATA>>2;
TEMP=10*(float)ADC_DRH/(0x100-(float)ADC_DRH);
// temp=10*(float)(ADC_DATA/(0x100-ADC_DATA));
TEMP=cha_biao(TEMP);
ADC_DATA+=TEMP;
if(++Tempture_Read_Counter>39)
{
Tempture_Read_Counter=0;
if((Real_Tempture>Set_High_Tempture)||(Real_Tempture>2)+Real_Tempture)>>1;
ADC_DATA=0;
//[Set_High_Tempture : Set_Low_Tempture],exp:[15C:35C]
if((Real_Tempture>Set_High_Tempture)||(Real_TemptureSet_High_Tempture)
TemptureAlam_NormalLowHigh='H';
else if(Real_TemptureSet_High_Tempture)||(Real_Tempture=25) // 去键抖动25
{
Key_Shake=0;
UnLockScreen_TimeoutCounter=0;
LockScreen_TimeoutCounter=0;
if(flag_ScreenLock_Status==1) // 判断屏状态
{
do
{
flag_have_key=1;
key_unlock=Read_Key_Num();
Lcd_Disp_KeyDynamic();
//Delay_ms(100);
Lcd_Display();
}while(flag_ScreenLock_Status==1&&key_unlock!=0xff);
if(flag_ScreenLock_Status==0)
{
Lcd_Display();
//if(flag_Buzzer==0){ht_writecmd(Command, toneoff);flag_Buzzer=1;}
}
if(key_unlock==0xff) // 防止半途松开按键
{
flag_ScreenLock_Status=1;
flag_have_key=0;
}
ht_writecmd(Command, toneon);
while(Read_Key_Num()!=0xff); // 等待键松开
ht_writecmd(Command, toneoff);
}
else
//if(flag_ScreenLock_Status==0) // 不锁屏的情况下直接按键操作
{
key_use=Read_Key_Num();
flag_have_key=1;
//if(flag_Buzzer==0){ht_writecmd(Command, toneoff);flag_Buzzer=1;}
switch(key_use)
{
case Lamp1_Key1:
if(flag_auto_hand==0)
{flag_lamp1_onoff=(~flag_lamp1_onoff)&0x01;}
break;
case Lamp2_Key2:
if(flag_auto_hand==0)
{flag_lamp2_onoff=(~flag_lamp2_onoff)&0x01;}
break;
case UVC_Key3:
if(flag_auto_hand==0)
{flag_UVC_onoff=(~flag_UVC_onoff)&0x01;}
break;
case Adjust_Key4:
/*
ClockTimeSetup_Stepper 时段设置:lamp1,lamp2,UV-C
1.lamp1(1时段):1 开 定时器0-开
2. 1 关 定时器0-关
3. 2 开 定时器1-开
4. 2 关 定时器1-关
5.lamp2(2时段):1 开 定时器2-开
6. 1 关 定时器2-关
7. 2 开 定时器3-开
8. 2 关 定时器3-关
9.UV-C(3时段): 1 开 定时器4-开
10. 1 关 定时器4-关
11. 2 开 定时器5-开
12. 2 关 定时器5-关
定时器6~定时器9 备用
*/
if(flag_LampTimeSetting) // 处于《灯的定时》设置状态...
{
switch(LampTimeSetup_Stepper) // 共12步,12个位置调节
{
case 1:
if(Set_Open_Minute[0]!=0)
{
Set_Open_Minute[0]=0;
if(++Set_Open_Hour[0]>=24)
{Set_Open_Hour[0]=0;}
}
else
{Set_Open_Minute[0]=30;}
break;
case 2:
if(Set_Close_Minute[0]!=0)
{
Set_Close_Minute[0]=0;
if(++Set_Close_Hour[0]>=24)
{Set_Close_Hour[0]=0;}
}
else
{Set_Close_Minute[0]=30;}
break;
case 3:
if(Set_Open_Minute[1]!=0)
{
Set_Open_Minute[1]=0;
if(++Set_Open_Hour[1]>=24)
{Set_Open_Hour[1]=0;}
}
else
{Set_Open_Minute[1]=30;}
break;
case 4:
if(Set_Close_Minute[1]!=0)
{
Set_Close_Minute[1]=0;
if(++Set_Close_Hour[1]>=24)
{Set_Close_Hour[1]=0;}
}
else
{Set_Close_Minute[1]=30;}
break;
case 5:
if(Set_Open_Minute[2]!=0)
{
Set_Open_Minute[2]=0;
if(++Set_Open_Hour[2]>=24)
{Set_Open_Hour[2]=0;}
}
else
{Set_Open_Minute[2]=30;}
break;
case 6:
if(Set_Close_Minute[2]!=0)
{
Set_Close_Minute[2]=0;
if(++Set_Close_Hour[2]>=24)
{Set_Close_Hour[2]=0;}
}
else
{Set_Close_Minute[2]=30;}
break;
case 7:
if(Set_Open_Minute[3]!=0)
{
Set_Open_Minute[3]=0;
if(++Set_Open_Hour[3]>=24)
{Set_Open_Hour[3]=0;}
}
else
{Set_Open_Minute[3]=30;}
break;
case 8:
if(Set_Close_Minute[3]!=0)
{
Set_Close_Minute[3]=0;
if(++Set_Close_Hour[3]>=24)
{Set_Close_Hour[3]=0;}
}
else
{Set_Close_Minute[3]=30;}
break;
case 9:
if(Set_Open_Minute[4]!=0)
{
Set_Open_Minute[4]=0;
if(++Set_Open_Hour[4]>=24)
{Set_Open_Hour[4]=0;}
}
else
{Set_Open_Minute[4]=30;}
break;
case 10:
if(Set_Close_Minute[4]!=0)
{
Set_Close_Minute[4]=0;
if(++Set_Close_Hour[4]>=24)
{Set_Close_Hour[4]=0;}
}
else
{Set_Close_Minute[4]=30;}
break;
case 11:
if(Set_Open_Minute[5]!=0)
{
Set_Open_Minute[5]=0;
if(++Set_Open_Hour[5]>=24)
{Set_Open_Hour[5]=0;}
}
else
{Set_Open_Minute[5]=30;}
break;
case 12:
if(Set_Close_Minute[5]!=0)
{
Set_Close_Minute[5]=0;
if(++Set_Close_Hour[5]>=24)
{Set_Close_Hour[5]=0;}
}
else
{Set_Close_Minute[5]=30;}
break;
default:
LampTimeSetup_Stepper=0;
flag_LampTimeSetting=0;
break;
}
}
/*
LampTimeSetup_Stepper 时钟设置:(当前北京时间设置)
1. 年十位
2. 年个位
3. 月十位
4. 月个位
5. 日十位
6. 日个位
7. 时十位
8. 时个位
9. 分十位
10.分个位
*/
else if(flag_ClockTimeSetting) // 处于《时钟调时》设置状态...
{
switch(ClockTimeSetup_Stepper) // 共10步,10个位置调节
{
case 1:
unit=Disp_Year%10;
decade=Disp_Year/10;
decade++;
decade%=10;
Disp_Year=decade*10+unit;
break;
case 2:
unit=Disp_Year%10;
decade=Disp_Year/10;
unit++;
unit%=10;
Disp_Year=decade*10+unit;
break;
case 3:
unit=Disp_Month%10;
decade=Disp_Month/10;
decade++;
decade%=2;
Disp_Month=decade*10+unit;
break;
case 4:
unit=Disp_Month%10;
decade=Disp_Month/10;
unit++;
if(decade==1) unit%=3;
else unit%=10;
if(decade==0&&unit==0) unit=1;
Disp_Month=decade*10+unit;
break;
case 5:
unit=Disp_Day%10;
decade=Disp_Day/10;
decade++;
decade%=4;
if(decade==0&&unit==0) unit=1;
Disp_Day=decade*10+unit;
break;
case 6:
unit=Disp_Day%10;
decade=Disp_Day/10;
unit++;
if(decade==3) unit%=2;
else unit%=10;
if(decade==0&&unit==0) unit=1;
Disp_Day=decade*10+unit;
break;
case 7:
unit=Disp_Hour%10;
decade=Disp_Hour/10;
decade++;
decade%=3;
Disp_Hour=decade*10+unit;
break;
case 8:
unit=Disp_Hour%10;
decade=Disp_Hour/10;
unit++;
if(decade==2)
unit%=4;
else
unit%=10;
Disp_Hour=decade*10+unit;
break;
case 9:
unit=Disp_Minute%10;
decade=Disp_Minute/10;
decade++;
decade%=6;
Disp_Minute=decade*10+unit;
break;
case 10:
unit=Disp_Minute%10;
decade=Disp_Minute/10;
unit++;
unit%=10;
Disp_Minute=decade*10+unit;
break;
default:
ClockTimeSetup_Stepper=0;
flag_ClockTimeSetting=0;
break;
}
}
else // 手动自动切换
{
flag_auto_hand_change=1;
do
{
flag_have_key=1;
key_use=Read_Key_Num();
Lcd_Disp_KeyDynamic();
//Delay_ms(100);
Lcd_Display();
}while(flag_auto_hand_change==1&&key_use!=0xff&&key_use!=K4K6);
if(key_use==K4K6)
{
System_Init();
ESP8266_RESTORE();
}
if(flag_auto_hand_change==0)
{
//if(key_use==K4K6)
//{
// System_Init();
// ESP8266_RESTORE();
//}
if(key_use==Adjust_Key4)
{
flag_auto_hand=(~flag_auto_hand)&0x01;
Lcd_Display();
}
}
if(key_use==0xff) // 防止半途松开按键
{
flag_auto_hand_change=0;
flag_have_key=0;
}
//ht_writecmd(Command, toneon);
//while(Read_Key_Num()!=0xff); // 等待键松开
//ht_writecmd(Command, toneoff);
}
break;
case Lamp_ShiDuan_Key5:
flag_LampTimeSetting=1; // 即将进行《灯的定时》设置
flag_ClockTimeSetting=0;
LampTimeSetup_Stepper++;
if(LampTimeSetup_Stepper%2==1)
{flag_Open_Time=1;flag_Close_Time=0;}
else
{flag_Open_Time=0;flag_Close_Time=1;}
if(LampTimeSetup_Stepper>12)
{
LampTimeSetup_Stepper=0;
flag_LampTimeSetting=0;
flag_LampTime_Change=1;
//MCUeeprom_write();
//MCUeeprom_read();
}
break;
case Clock_Setup_Key6:
flag_ClockTimeSetting=1; // 即将进行《时钟调时》设置
flag_LampTimeSetting=0;
ClockTimeSetup_Stepper++;
if(ClockTimeSetup_Stepper>10)
{
Write_Time();
//Disp_Year=Disp_Month=Disp_Day=Disp_Hour=Disp_Minute=Disp_Week=0;
//Read_Time();
ClockTimeSetup_Stepper=0;
flag_ClockTimeSetting=0;
flag_ClockTime_Change=1;
}
break;
default:break;
}
//if((flag_LampTimeSetting&&key_use==Adjust_Key4)||(flag_ClockTimeSetting&&key_use==Adjust_Key4)||key_use<4||key_use==5|key_use==6)
{
ht_writecmd(Command, toneon);
while(Read_Key_Num()!=0xff); // 等待键松开
ht_writecmd(Command, toneoff);
}
MCUeeprom_write();
}
}
}
else // 去键抖动 or 没有按键的情况下:
{
Key_Shake=0;
Key_Back=key_use;
flag_have_key=0;
}
}
/*********************自动还是手动处理*************************/
void Autohand_Control(void)
{
unsigned char i;
unsigned int Timer_open[10],Timer_close[10],Now_time;
/*
@near unsigned char Timers_Enable[11]; 1,2,3,4,5,6,7,8,9,10
@near unsigned char Set_Open_Hour[10]; 0,1,2,3,4,5,6,7,8,9
@near unsigned char Set_Open_Minute[10]; 0,1,2,3,4,5,6,7,8,9
@near unsigned char Set_Close_Hour[10]; 0,1,2,3,4,5,6,7,8,9
@near unsigned char Set_Close_Minute[10]; 0,1,2,3,4,5,6,7,8,9
*/
if(flag_auto_hand==1) //0=手动,1=自动
{
for(i=0;i<10;i++)
{
Timer_open[i] =Set_Open_Hour[i]*60+Set_Open_Minute[i];
Timer_close[i]=Set_Close_Hour[i]*60+Set_Close_Minute[i];
}
Now_time=Disp_Hour*60+Disp_Minute;
// Timer1 = 1时段(Lamp1):1开 1关
if(Timers_Enable[1]&&(Now_time>=Timer_open[0])&&(Now_time=Timer_open[1])&&(Now_time=Timer_open[2])&&(Now_time=Timer_open[3])&&(Now_time=Timer_open[4])&&(Now_time=Timer_open[5])&&(Now_time=10)
// {
// //ESP8266_RST();
// IWDG_Enable();
// }
// 1.9 上电若DISCONNECT设置flag_DisConnect_Monitoring180s=1,若180s无入网信息, 则复位模块,设置flag_DisConnect180s_StartRST=1
// else if(flag_DisConnect180s_StartRST)
// {
// flag_DisConnect180s_StartRST=0;
// ESP8266_RST();
// }
else if(flag_LoginTCP_SendOnce) // 登录TCP服务器 24
{
flag_LoginTCP_SendOnce=0;
flag_NoLoginBack_Monitoring150s=1;
make_AT_CIPSEND(24,0,255); // 命令头:AT+CIPSEND=0,len 【0=id,len=数据长度】;
Function_Code=1;
Load_Header_15data(0,'S');
Send_Buffer[15]=factory_data;
Send_Buffer[16]=pcb_data;
Send_Buffer[17]=mcu_data;
for(i=18;i<22;i++)
Send_Buffer[i]=LOC_IP_buf[i-18];
CRC16=GetRevCrc_16(Send_Buffer,22);
Send_Buffer[22]=CRC16>>8;
Send_Buffer[23]=CRC16;
Send_Num=24;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,SEND_OK))==NULL&&flag_RS232_TimeoutStart);// 此循环完成 SEND OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
System_Status=161;
// 打印了 "SEND OK"
flag_SEND_FAIL=0;
}
else
{
System_Status=160;
// 打印了 "SEND FAIL"
flag_SEND_FAIL=1;
}
//Lcd_Disp_Tempture(System_Status);
// 等待回复,接收网络时间;
}
else if(flag_TCP_Logined)
{
if(flag_Tempture_Abnormal&&TemptureAlam_NormalLowHigh!='N')// 温度异常报警(包括:高温和低温) 22
{
if(TemptureAlam_Close_Open_Setup==1) // 报警状态开启的情况下
{
if((Real_Tempture>(Set_High_Tempture+6))||(Real_Tempture<(Set_Low_Tempture-6)))
{
flag_Tempture_Abnormal=0;
make_AT_CIPSEND(22,0,255); // 命令头:AT+CIPSEND=0,len 【0=id,len=数据长度】;
Function_Code=9;
Load_Header_15data(0,'S');
Send_Buffer[16]=Real_Tempture/0x100;
Send_Buffer[17]=Real_Tempture%0x100;//温度
if('H'==TemptureAlam_NormalLowHigh)
{
Send_Buffer[15]=1;
Send_Buffer[18]=Set_High_Tempture/0x100;
Send_Buffer[19]=Set_High_Tempture%0x100;//报警温度 High
}
else if('L'==TemptureAlam_NormalLowHigh)
{
Send_Buffer[15]=0;
Send_Buffer[18]=Set_Low_Tempture/0x100;
Send_Buffer[19]=Set_Low_Tempture%0x100;//报警温度 Low
}
CRC16=GetRevCrc_16(Send_Buffer,20);
Send_Buffer[20]=CRC16>>8;
Send_Buffer[21]=CRC16;
Send_Num=22;
UART2_Send_Buffer_Check(Send_Num);
while((pStr1=strstr(Receive_Buffer1,SEND_OK))==NULL);// 此循环完成 SEND OK
flag_RS232_TimeoutStart=0;
InBuffer_ID=0;Receive_Count0=0;
if(pStr1!=NULL)
{
System_Status=201;
// 打印了 "SEND OK"
flag_SEND_FAIL=0;
}
else
{
System_Status=200;
// 打印了 "SEND FAIL"
flag_SEND_FAIL=1;
}
//Lcd_Disp_Tempture(System_Status);
// 等待回复
}
}
}
else if(flag_HeartBeat10s)//&&flag_NoLoginBack_Monitoring150s==0) // 心跳包
{
flag_HeartBeat10s=0;
HeartBeat10s_TimeoutCounter=0;
make_AT_CIPSEND(71,0,'0'); // 命令头:AT+CIPSEND=0,len 【0=id,len=数据长度】;
Function_Code=8;
Heart_and_State_Return('S');
// 不回复
}
}
}
/*********************形成整个帧数据链,接收*************************/
// \r\n +IPD,0,xx:0Fdd...
// LOCMAC,"18:fe:34:db:0d:33"
// RMTMAC,"5c:cf:7f:07:65:21"
//const unsigned char maohao[]={":"};
const unsigned char test_IPD[]={'\r','\n','+','I','P','D',',','0',',','1','9',
'1','9','2','.','1','9','2','.','1','9','2','.','1','9','2',',','9','9','9','9',':',
0, // 发送方0
7, // 功能码
0x18,0xfe,0x34,0xdb,0x0d,0x33, // LOC_MAC
0x5c,0xcf,0x7f,0x07,0x65,0x21, // RMT_MAC
19, // 数据长度
11,22,33,44,55,66,77,88, // data
'C','R' // CRC16
};
void ReceiveData_Process(void) // +IPD,0,32:http://www.cmsoft.cn QQ:10865600
{
unsigned char i,j,temp,CRC16_L,CRC16_H,CRC16_Check_OK;
unsigned int CRC16 = 0xffff;
/*
flag_Receive_NewFrame_Buffer0=1;
for(i=0;i<50;i++)
Receive_Buffer0[i]=test_IPD[i];
temp=strloc(Receive_Buffer0,plusIPD);
temp=0;
temp=strloc(Receive_Buffer0,"+IPD,");
temp=0;
temp=strloc(Receive_Buffer0,plusIPD);
temp=0;
*/
if(flag_Receive_NewFrame_Buffer0)
{
flag_Receive_NewFrame_Buffer0=0;
HeartBeat10s_TimeoutCounter=0;
HeartBeat_0_TimeoutCounter=0;
HeartBeat_1_TimeoutCounter=0;
//for(i=0;i, :
// +IPD,,[,,]:
// 0 1 23456789abcdef
//例如:\r\n+IPD,0,32:http://www.cmsoft.cn QQ:10865600
if(Receive_Buffer0[temp+5]=='0') // id号
{Link_id='0';}
else // if(Receive_Buffer0[temp+7]=='1')
{Link_id='1';} // udp_adder=Receive_Buffer0[temp+7];
temp=temp+7; // =9
if((Receive_Buffer0[temp]>='0')&&(Receive_Buffer0[temp]<='9'))//9 maxlen=2048
{
Receive_NewFrame_Length=Receive_Buffer0[temp]-'0';
temp++;
if((Receive_Buffer0[temp]>='0')&&(Receive_Buffer0[temp]<='9'))//10
{
Receive_NewFrame_Length=(Receive_Buffer0[temp-1]-'0')*10+(Receive_Buffer0[temp]-'0');
temp++;
if((Receive_Buffer0[temp]>='0')&&(Receive_Buffer0[temp]<='9')) //*11
{
Receive_NewFrame_Length=(Receive_Buffer0[temp-2]-'0')*100+(Receive_Buffer0[temp-1]-'0')*10+(Receive_Buffer0[temp]-'0');
temp++;
if((Receive_Buffer0[temp]>='0')&&(Receive_Buffer0[temp]<='9')) //*12
{
Receive_NewFrame_Length=(Receive_Buffer0[temp-3]-'0')*1000+(Receive_Buffer0[temp-2]-'0')*100\
+(Receive_Buffer0[temp-1]-'0')*10+(Receive_Buffer0[temp]-'0');
}
}
}
}
// 获取远端IP和对端端口
if(Receive_Buffer0[temp]==','); // 11=","
temp++;
//if(Receive_Buffer0[temp]=='"'); // 12="""
//temp++;
for(i=0;i<10;i++)
{
if(Receive_Buffer0[temp+i]=='.')
break;
}
if(i==1)
RMT_IP_buf[0]=(Receive_Buffer0[temp]-'0');
else if(i==2)
RMT_IP_buf[0]=(Receive_Buffer0[temp]-'0')*10 +(Receive_Buffer0[temp+1]-'0');
else if(i==3)
RMT_IP_buf[0]=(Receive_Buffer0[temp]-'0')*100+(Receive_Buffer0[temp+1]-'0')*10+(Receive_Buffer0[temp+2]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer0[temp+i]=='.')
break;
}
if(i==1)
RMT_IP_buf[1]=(Receive_Buffer0[temp]-'0');
else if(i==2)
RMT_IP_buf[1]=(Receive_Buffer0[temp]-'0')*10+(Receive_Buffer0[temp+1]-'0');
else if(i==3)
RMT_IP_buf[1]=(Receive_Buffer0[temp]-'0')*100+(Receive_Buffer0[temp+1]-'0')*10+(Receive_Buffer0[temp+2]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer0[temp+i]=='.')
break;
}
if(i==1)
RMT_IP_buf[2]=(Receive_Buffer0[temp+i-1]-'0');
else if(i==2)
RMT_IP_buf[2]=(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
else if(i==3)
RMT_IP_buf[2]=(Receive_Buffer0[temp+i-3]-'0')*100+(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer0[temp+i]==',')
break;
}
if(i==1)
RMT_IP_buf[3]=(Receive_Buffer0[temp+i-1]-'0');
else if(i==2)
RMT_IP_buf[3]=(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
else if(i==3)
RMT_IP_buf[3]=(Receive_Buffer0[temp+i-3]-'0')*100+(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
temp=temp+i+1;
for(i=0;i<10;i++)
{
if(Receive_Buffer0[temp+i]==':')
break;
}
if(i==1)
RMT_IP_PORT=(Receive_Buffer0[temp+i-1]-'0');
else if(i==2)
RMT_IP_PORT=(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
else if(i==3)
RMT_IP_PORT=(Receive_Buffer0[temp+i-3]-'0')*100+(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
else if(i==4)
RMT_IP_PORT=(Receive_Buffer0[temp+i-4]-'0')*1000+(Receive_Buffer0[temp+i-3]-'0')*100+(Receive_Buffer0[temp+i-2]-'0')*10+(Receive_Buffer0[temp+i-1]-'0');
temp=temp+i+1;
//
temp=strloc(Receive_Buffer0,":");
if(Receive_Buffer0[temp]==':'); // 11=":"
temp++;
if(Receive_Buffer0[temp]==1); // 12,对方发=1,我方回复=0
Function_Code=Receive_Buffer0[temp+1]; // 13,功能码
//1.服务器回复设备登录指令(25字节) Function_Code==1, 主动发送的 这里是返回
if((25==Receive_NewFrame_Length)&&(1==Function_Code))
{
flag_HeartBeat10s=1; // 立马启动一次心跳
flag_TCP_Logined=1;
flag_NoLoginBack_Monitoring150s=0;
if(Check_Header_15data(temp))
{
temp=temp+15;
CRC16=Receive_Buffer0[temp++]*0x100; // 0x07
CRC16+=Receive_Buffer0[temp++]; // 0xdf
Disp_Year=CRC16%100; // 0x07df=2015
Disp_Month=Receive_Buffer0[temp++];
Disp_Day=Receive_Buffer0[temp++];
Disp_Hour=Receive_Buffer0[temp++];
Disp_Minute=Receive_Buffer0[temp++];
Disp_Second=Receive_Buffer0[temp++];
Disp_Week=Receive_Buffer0[temp];
Write_Time();
CRC16_L=Receive_Buffer0[temp+1];
CRC16_H=Receive_Buffer0[temp+2];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+1);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//2.切换工作模式指令(18字节)Function_Code==2
else if((18==Receive_NewFrame_Length)&&(2==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
if(Receive_Buffer0[temp]==0x0)
flag_auto_hand=0;
else
flag_auto_hand=1;
CRC16_L=Receive_Buffer0[temp+1];
CRC16_H=Receive_Buffer0[temp+2];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+1);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//3.手动模式下开关指令(19字节)Function_Code==3
else if((19==Receive_NewFrame_Length)&&(3==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
if(flag_auto_hand==0)
{
if(Receive_Buffer0[temp]==1)//灯编号1=lamp1
{
if(Receive_Buffer0[temp+1]==0)flag_lamp1_onoff=0;
else if(Receive_Buffer0[temp+1]==1)flag_lamp1_onoff=1;
}
else if(Receive_Buffer0[temp]==2)//灯编号2=lamp2
{
if(Receive_Buffer0[temp+1]==0)flag_lamp2_onoff=0;
else if(Receive_Buffer0[temp+1]==1)flag_lamp2_onoff=1;
}
else if(Receive_Buffer0[temp]==3)//灯编号3=UVC_pump
{
if(Receive_Buffer0[temp+1]==0)flag_UVC_onoff=0;
else if(Receive_Buffer0[temp+1]==1)flag_UVC_onoff=1;
}
else if(Receive_Buffer0[temp]==4)//灯编号4=..
{
if(Receive_Buffer0[temp+1]==0)flag_lamp4_onoff=0;
else flag_lamp4_onoff=1;
}
else if(Receive_Buffer0[temp]==5)//灯编号5=..
{
if(Receive_Buffer0[temp+1]==0)flag_lamp5_onoff=0;
else flag_lamp5_onoff=1;
}
CRC16_L=Receive_Buffer0[temp+2];
CRC16_H=Receive_Buffer0[temp+3];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+2);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
}
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//4.设置定时器时间指令(22字节)Function_Code==4
else if((22==Receive_NewFrame_Length)&&(4==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
//Timers_Enable[Receive_Buffer0[temp]]=1; // 只是设定定时器定时时间
i=Receive_Buffer0[temp]-1; // 1~10
Set_Open_Hour[i]=Receive_Buffer0[temp+1];
Set_Open_Minute[i]=Receive_Buffer0[temp+2];
Set_Close_Hour[i]=Receive_Buffer0[temp+3];
Set_Close_Minute[i]=Receive_Buffer0[temp+4];
CRC16_L=Receive_Buffer0[temp+5];
CRC16_H=Receive_Buffer0[temp+6];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+5);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//5.设置报警温度指令(22字节)Function_Code==5
else if((22==Receive_NewFrame_Length)&&(5==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
if(Receive_Buffer0[temp]<2)
TemptureAlam_Close_Open_Setup=Receive_Buffer0[temp];
// TemptureAlam_Close_Open_Setup=0,关报警;
// TemptureAlam_Close_Open_Setup=1,开报警;
// TemptureAlam_Close_Open_Setup=2,只是设置预警温度(不管是否开关报警)
else if(2==Receive_Buffer0[temp])
{
Set_Low_Tempture=Receive_Buffer0[temp+1]*0x100+Receive_Buffer0[temp+2];
Set_High_Tempture=Receive_Buffer0[temp+3]*0x100+Receive_Buffer0[temp+4];
}
CRC16_L=Receive_Buffer0[temp+5];
CRC16_H=Receive_Buffer0[temp+6];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+5);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//6.查询设备所有状态指令(17字节)Function_Code==6
else if((17==Receive_NewFrame_Length)&&(6==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
CRC16_L=Receive_Buffer0[temp];
CRC16_H=Receive_Buffer0[temp+1];
CRC16=GetRevCrc_16(Receive_Buffer0,temp);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
}
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
//7.配置设备入网指令(37字节)Function_Code==7 zhang
else if((37==Receive_NewFrame_Length)&&(7==Function_Code))
{
//\r\n +IPD,0,xx:0Fdd... 多路连接时(+CIPMUX=1)+IPD,,:
// 0 1 23456789abcdef
//例如:\r\n+IPD,0,32:http://www.cmsoft.cn QQ:10865600
if(Check_Header_15data(temp))
{
temp=temp+15;
for(i=0;i<20;i++)
URL_ADDR[i]=Receive_Buffer0[temp+i];
CRC16_L=Receive_Buffer0[temp+i];
CRC16_H=Receive_Buffer0[temp+i+1];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+i);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
Have_New_URL=0xea;
make_AT_CIPSEND(20,0,255);
UDP1_Return(7);
if(flag_TCP0_Connected)
ESP8266_CIPCLOSE('0');
ESP8266_CIPSTART_TCP('0');
flag_TCP_Logined=0;
// 验证下新域名是否正确(是否能连接上'id=2'?)
/*
if(Link_id=='1')
ESP8266_CIPSTART_NewTCP_Check('2');
else if(Link_id=='2')
ESP8266_CIPSTART_NewTCP_Check('1');
// 这里是回复UDP命令
make_AT_CIPSEND(20,0,255); // AT+CIPSEND=1,20,255.255.255.255,9954 全网群发
if(Have_New_URL==0xea)
UDP1_Return(7);
else
UDP1_Return(0xff);
*/
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
//8.Function_Code==8,心跳 主动发送 不设返回
//9.Function_Code==9,报温 主动发送 不设返回
//10.开关定时器指令(19字节)Function_Code==10
else if((19==Receive_NewFrame_Length)&&(10==Function_Code))
{
if(Check_Header_15data(temp))
{
temp=temp+15;
i=Receive_Buffer0[temp];
Timers_Enable[i]=Receive_Buffer0[temp+1];
CRC16_L=Receive_Buffer0[temp+2];
CRC16_H=Receive_Buffer0[temp+3];
CRC16=GetRevCrc_16(Receive_Buffer0,temp+2);
if(CRC16==(CRC16_H*0x100+CRC16_L)){CRC16_Check_OK=1;} // 数据校验
CRC16_Check_OK=1;
////
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ht_writecmd(Command, toneon);
//flag_Buzzer=1;
BEEP_ms(10);
}
}
// 进行回复,Function_Code=,2,3,4,5,6,7,,,10
if(CRC16_Check_OK&&Function_Code!=1&&Function_Code!=7&&Function_Code!=8&&Function_Code!=9)
{
make_AT_CIPSEND(71,0,255); // 命令头:AT+CIPSEND=0,len 【0=id,len=数据长度】;
Heart_and_State_Return('R');
}
else
{
//Function_Code=0xff; // 要求重发上条命令
}
MCUeeprom_write(); // 保存xin数据到MCUeeprom;60bytes;
}
// 一、密码正确的情况下:第一次"SmartLink"后显示1~7, 第二次上电自动联网显示5和6,5~6相隔3秒
// 1. smartconfig type:ESPTOUCH
// 2. Smart get wifi info
// 3. ssid:TP-LINK_0202
// 4. password:1234567890
// 5. WIFI CONNECTED
// 6. WIFI GOT IP
// 7. smartconfig connected wifi
// 二、密码错误的情况下:
//smartconfig type:ESPTOUCH
//Smart get wifi info
//ssid:TP-LINK_0202
//password:15800
//WIFI DISCONNECT
else if((pStr0=strstr(Receive_Buffer0,ready))!=NULL)// "ready"
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_WiFi_ready=1;
ESP8266_CWMODE('1');
//ESP8266_CIPMODE('0'); // 默认'0'
ESP8266_CIPMUX('1');
ESP8266_CIPDINFO('1');
NoWiFi5s_TimeoutCounter=0;
flag_ready_Monitoring5s=1; // 5S ago 启动flag_ready5s_STARTSMART=1;
System_Status=31;
//Lcd_Disp_Tempture(System_Status);
}
else if((pStr0=strstr(Receive_Buffer0,WIFI_DISCONNECT))!=NULL)// "WIFI DISCONNECT"
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_WiFi_Disconnect=1;
flag_WiFi_Connected=0;
flag_TCP0_Connected=0;
flag_WiFi_Connect_Enable=1;
NoWiFi5s_TimeoutCounter=0;
flag_ready_Monitoring5s=0; // 5S ago 启动flag_ready5s_STARTSMART=1;
System_Status=220;
//Lcd_Disp_Tempture(System_Status);
//ESP8266_RST();
}
else if((pStr0=strstr(Receive_Buffer0,WIFI_CONNECTED))!=NULL)// "WIFI CONNECTED"
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_ready_Monitoring5s=0;
flag_ready5s_STARTSMART=0;
flag_WiFi_Connect_Enable=1;
flag_WiFi_Disconnect=0;
}
else if((pStr0=strstr(Receive_Buffer0,WIFI_GOT_IP))!=NULL)// "WIFI GOT IP"
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//flag_DisConnect_Monitoring180s=0;
flag_WiFi_Disconnect=0;
flag_WiFi_Connected=1;
flag_WiFi_Smarting=0;
ESP8266_CIFSR();
//ESP8266_CIPDINFO('1');
InBuffer_ID=0;
ESP8266_CIPSTART_UDP('1'); // 开启UDP0连接
ESP8266_CIPSTART_TCP('0'); // 开启TCP1连接
System_Status=151;
//Lcd_Disp_Tempture(System_Status);
}
// "0,CONNECT",TCP0连接成功
else if(((pStr0=strstr(Receive_Buffer0,TCP_0_CONNECT))!=NULL))
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_TCP0_Connected=1;
flag_LoginTCP_SendOnce=1;
//flag_NoLoginBack_Monitoring150s=0;
BEEP_ms(200);
System_Status=161;
flag_Restart_Connect_TCP=0;
//Lcd_Disp_Tempture(System_Status);
}
// "1,CONNECT",UDP连接成功
else if((pStr0=strstr(Receive_Buffer0,UDP_1_CONNECT))!=NULL)
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_UDP1_Connected=1;
}
else if((pStr0=strstr(Receive_Buffer0,SEND_OK))!=NULL)// "SEND OK" CIPSEND发送数据成功
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//flag_NoLoginBack_Monitoring150s=0;
flag_TCP0_Connected=1;
}
else if(((pStr0=strstr(Receive_Buffer0,TCP0_CLOSED))!=NULL)||((pStr0=strstr(Receive_Buffer0,DNS_Fail))!=NULL))// "CLOSED",TCP连接失败DNS Fail
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
flag_TCP0_Connected=0;
//flag_TCP0_Connecting=1;
flag_SEND_FAIL=0;
flag_TCP_Logined=0;
BEEP_ms(200);
//Delay_ms(10000);
//ESP8266_RST();
//ESP8266_CIPCLOSE(Link_id);
//ESP8266_CIPSTART_TCP('0');// 开启TCP0连接
//flag_NoLoginBack_Monitoring150s=1;
System_Status=160;
//Lcd_Disp_Tempture(System_Status);
flag_Restart_Connect_TCP=1;
}
else if((pStr0=strstr(Receive_Buffer0,ERROR))!=NULL)
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ESP8266_RST();
IWDG_Enable();
//flag_Restart_Connect_TCP=1;
}
else if((pStr0=strstr(Receive_Buffer0,link_is_not_valid))!=NULL)
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ESP8266_RST();
IWDG_Enable();
}
else if((pStr0=strstr(Receive_Buffer0,FAIL))!=NULL)
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ESP8266_RST();
IWDG_Enable();
}
else if(flag_SEND_FAIL)
{
for(i=0;i<120;i++)
Receive_Buffer0[i]=0;
//ESP8266_RST();
IWDG_Enable();
}
/*
else if((pStr0=strstr(Receive_Buffer0,Smart_get_wifi_info))!=NULL)// "Smart_get_wifi_info"
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,smarting_connected_wifi))!=NULL)// "smartconfig connected wifi"
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,SEND_OK))!=NULL)// "SEND OK" CIPSEND发送数据成功
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,send_logo))!=NULL)// "> "
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,ALREADY_CONNECT))!=NULL)// "ALREADY CONNECT",TCP连接已经存在;
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,FAIL))!=NULL)// "FAIL"
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,ERROR))!=NULL)// "ERROR"
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
else if((pStr0=strstr(Receive_Buffer0,OK))!=NULL)// "OK"
{for(i=0;i<120;i++)Receive_Buffer0[i]=0;}
*/
}
}
/*
启朱唇,发皓齿,丁香小舌,吹气如兰。
不急不慢似吟似唱,莺啼婉转情意绵绵。
心旷神怡,如听高山流水;意乱情迷,如闻艳曲狂弦。
先惹起满腔心火,又送上一缕清泉。
制服诱惑巧裁剪,勾出一身玲珑线。
婀娜体态,遮得庄严。
稍不慎露出半截手腕,怎不能叫人浮想联翩。
领口又开三分低,贴身小衣竟可见。
拿捏得恰到好处,总不给看个完全。
望眼欲穿,捶胸空叹。
遥不可及,枉自垂涎。
只可远观,不可亵玩。
惟从这深深沟渠,梦想那壮美山川。
今朝把发辫松挽,明日将青丝束偏。
百变妆容,千般娇艳。
亭亭玉立姿,盈盈秋波转。
天生本是风流骨,偏要板起桃花面。
撩动春风吸人魄,潜入春梦惹人怜。
这一番销魂蚀骨,端的是难以言传。
*/
/**********************************************/
void main(void)
{
unsigned char i,j;
int USE;
//**********************初始化UART2**********************
UART2_CR1 = 0x00;
UART2_CR2 = 0x00;
UART2_CR3 = 0x00;
UART2_BRR2 = 0x00;
UART2_BRR1 = 0x06;
// UART_DIV[15:0]=fMASTER/波特率;
// UART_BRR1=UART_DIV[11:4]
// UART_BRR1=UART_DIV[15:12]+UART_DIV[3:0]
// fMASTER=11059200(11.0592MHz)
// 例如对于波特率115200时,分频系数=11059200/115200=96
// 对应的十六进制数为0060,BBR1=0x06,BBR2=00
// 例如对于波特率 9600时,分频系数=11059200/9600=1152
// 对应的十六进制数为0480,BBR1=0x48,BBR2=00
// UART2_SR = 0x0;
UART2_CR2 = 0x2C; //00101100
//位7:TIEN 发送中断使能;
//位6:TCIEN 发送完成中断使能;
//位5:RIEN *接收中断使能;
//位4:ILIEN IDLE中断使能;
//位3:TEN *发送使能;
//位2:REN *接收使能;
//位1:RWU 接收唤醒;
//位0:SBK 发送断开帧;
//*******************************************************
//*********************初始化MCU端口*********************
//pb口 pb0悬浮输入 ad
// pb1上拉输入 *PB1-ESP_EN
// pb4上拉输入 b0
// pb5上拉输入 b1
//pc口 pc1开漏输出 ds_data
// pc2开漏输出 ds_rst
// pc3开漏输出 LCD_backled_PC3
// pc4开漏输出 heating_PC4
// pc5开漏输出 UVC_PC7
// pc6开漏输出 lamp1_PC6
// pc7开漏输出 lamp2_PC5
//pd口 pd0开漏输出 *PD6-RSTESP
// pd2上拉输入 b3
// pd3开漏输出 lcd_data
// pd4开漏输出 lcd_wr
// pd5 TX
// pd6 RX
// pd7开漏输出 lcd_cs
//pe口 pe5开漏输出 ds_clk
//pf口 pf4上拉输入 b2
PE_DDR|=0x20;PE_CR1|=0x00;PE_CR2|=0x00;PE_ODR=0x00;
PF_DDR|=0x00;PF_CR1|=0x10;PF_CR2|=0x00;PF_ODR|=0x10;
PB_DDR|=0x00;PB_CR1|=0x30;PB_CR2|=0x00;PB_ODR|=0x30;
PC_DDR|=0xfe;PC_CR1|=0x00;PC_CR2|=0x00;PC_ODR=0x08;
PD_DDR|=0xb8;PD_CR1|=0x44;PD_CR2|=0x00;PD_ODR|=0x4;
//*******************************************************
//************************时钟控制***********************
// 8.9.1 内部时钟寄存器(CLK_ICKR)
// CLK_ICKR=0x01;
// 8.9.2 外部时钟寄存器(CLK_ECKR)
// CLK_ECKR=0x00;
// 8.9.3 主时钟状态寄存器(CLK_CMSR)
// CLK_CMSR=0xE1; // CLK_CMSR=CKM[7:0]:主时钟状态位
//0xE1:HSI为主时钟源(复位值)
//0xD2:LSI为主时钟源(仅当LSI_EN选项位为1时)
//0xB4:HSE为主时钟源
// 8.9.4 主时钟切换寄存器(CLK_SWR)
// 8.9.5 切换控制寄存器(CLK_SWCR)
CLK_SWCR|=0x02; // 向第二位SWEN写1将切换主时钟至寄存器CLK_SWR指定的时钟源。
CLK_SWR = 0xb4; // 0xB4:HSE为主时钟源
// 0xE1:HSI为主时钟源(复位值)16MHz
// 8.9.6 时钟分频寄存器(CLK_CKDIVR[4:0]),复位值:0x18
// 位 4:3(HSIDIV[1:0]:高速内部时钟预分频器) 11:fHSI = fHSI RC输出/8
// 位 2:0(CPUDIV[2:0]:CPU时钟预分频器) 000:fCPU = fMASTER
// CLK_CKDIVR = 0x18; // 主时钟 = 16MHZ / 8
// fCPU时钟 = fMASTER主时钟 = 2MHZ
// 8.9.7 外设时钟门控寄存器(CLK_PCKENR1)
// 8.9.8 外设时钟门控寄存器(CLK_PCKENR2)
// 8.9.9 时钟安全系统寄存器(CLK_CSSR)
// 8.9.10 可配置时钟输出寄存器
// 8.9.11 CAN 外部时钟控制寄存器(CLK_CANCCR)
// 8.9.12 HSI 时钟修正寄存器(CLK_HSITRIMR)
// 8.9.13 SWIM 时钟控制寄存器(CLK_SWIMCCR)
//*******************************************************
//**********************初始化A/D模块*********************
// ----------初始化A/D模块;
ADC_CR2 = 0x00; // A/D结果数据左对齐
ADC_CR1 = 0x00; // ADC时钟=主时钟/2=1MHZ
// ADC转换模式=单次
// 禁止ADC转换
ADC_CSR = 0x00; // 选择通道0
ADC_TDRL = 0x1;
ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换 并且连续转换
Delay(100); // 延时一段时间,至少7uS,保证ADC模块的上电完成
ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1
// 使能ADC转换
//*******************************************************
//********************初始化定时器模块*******************
TIM4_IER = 0x00; // 禁止中断
TIM4_EGR = 0x01; // 允许产生更新事件
TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128=64us微秒
TIM4_ARR =255;// 156; // 设定重装载时的寄存器值,255是最大值*64=16.320ms毫秒
TIM4_CNTR=255;//156; // 设定计数器的初值 //2MHZ/128/255/
// 定时周期=(ARR+1)*64=16320uS
TIM4_CR1 = 0x01; // b0 = 1,允许计数器工作
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM4_IER = 0x01; // 允许更新中断
//*******************************************************
_asm("rim"); // _asm("sim"); // 这是关中断
// _asm("rim"); // 这是开中断
//ht_writecmd(Command, toneon);
System_Init(); // 开机接收缓存区清零;
ht1621_cmd_init(); // 开机LCD初始化
//Disp_Second=readds1302(0)&0x7f;
//writeds1302(0x0,7); // 可以写
//writeds1302(Disp_Second,0);
//writeds1302(0xa5,8);
//writeds1302(0x80,7); // 写保护WP
//state0=readds1302(0x20);
//MCUeeprom_read();
//Read_Time();
//Delay_ms(200);
//ht_writecmd(Command, toneoff);
while (0) // for test
{
Delay(5000); // Delay(5000)=14ms
Delay(5000);
Delay(5000);
Delay(5000);
Delay(5000);
lamp2_PC5=~lamp2_PC5;
lamp1_PC6=~lamp1_PC6;
UVC_PC7=~UVC_PC7;
LCD_backled_PC3=~LCD_backled_PC3;
//ReceiveData_Process();
}
//_asm("rim");
while(0)
{
Delay(5000);
}
while (0) // for test
{
ht_writecmd(Command,lcdon);
Delay(5000);
Delay(5000);
ht_writecmd(Command,lcdoff);
Delay(5000);
Delay(5000);
for(i=0;i<32;i++)
ht_writedata(i,0xff,4);
Delay(5000);
Delay(5000);
for(i=0;i<32;i++)
{
Delay(5000);
Delay(5000);
for(j=0;j<16;j++)
{
ht_writedata_zdh(31-i,j,4);
Delay(5000);
Delay(5000);
}
}
}
while (0)
{
ht_writecmd(Command,lcdoff);
ESP8266_CombineKey(); // ESP8266入网配置;
Delay(5000);
}
while(0)
{
_asm("sim");
state0=0xaa;
Have_New_URL=0xab;
MCUeeprom_write();
Delay(50000);
for(i=55;i<75;i++)
URL_ADDR[i-55]=0;
state0=0;
Have_New_URL=0;
MCUeeprom_read();
Delay(50000);
flag_lamp2_onoff=1;
flag_lamp1_onoff=0;
flag_UVC_onoff=1;
flag_auto_hand=1;
MCUeeprom_write();
state0=0;
Delay(50000);
MCUeeprom_read();
Delay(50000);
}
while (0) // for test
{
flag_ScreenLock_Status=0;
while (0)
{
Key_Scanning_OK();
Lcd_Display();
Delay(50000);
//Delay(50000);
}
}
while(0) // for test
{
//Read_STAIP_STAMAC();
Delay(10);
//ReceiveData_Process();
Delay(10);
Heart_and_State_Return('S');
//Check_Header_15data(0);
Delay(10);
}
//flag_lamp2_onoff=0;
while(0)
{
//Key_Scanning_OK(); // 按键扫描;
_asm("sim");
//Read_Tempture();
make_AT_CIPSEND(20,255,255);
//ESP8266_CIPSTART_UDP1_BK(1);
Delay(10);
}
//MCUeeprom_write_URL();
//MCUeeprom_write();
MCUeeprom_read();
ESP8266_RST();
Link_id='0';
flag_ScreenLock_Status=1; // 开机设定面板是锁定的?
//ESP8266_RESTORE();
while (1)
{
InBuffer_ID=0;
//ESP8266_CombineKey(); // ESP8266组合键入网配置;
ReceiveData_Process(); // 被动:对接收的新数据.进行分析(回复、赋值、处理)
Key_Scanning_OK(); //ok 按键扫描;
Read_Time(); //ok 读DS1302的时间;
Read_Tempture(); //ok 采集温度and高温判断处理;
Lcd_Display(); //ok 屏幕刷新
Autohand_Control(); //ok 状态控制flag_auto_hand;若0手动模式(根据按键处理)...,若1自动模式(根据定时器处理)...;
CIPSendData_Process(); // 主动:根据状态变化主动发送数据;
// 温度显示或者通讯故障代码打印;
if(0)//if(flag_ScreenLock_Status==1&&Key_Back==Adjust_Key4)
{
Lcd_Disp_Tempture(System_Status);
//ht_writecmd(Command, toneon);
//while(Read_Key_Num()!=0xff); // 等待键松开
//ht_writecmd(Command, toneoff);
//MCUeeprom_write();
}
}
}
/*
"步骤" "返回" "说明"
1、AT+RST ready 重启;
1、AT+RESTORE ready 恢复出厂设置;
1、ATE0/1 OK 取消/设置回显功能;
2、AT+CWMODE=1 OK/ERROR 设置成STA;
2、AT+CIPMODE=0 OK/ERROR 设置非透传模式;
2、AT+CIPMUX=1 OK/ERROR 启动多路连接;
3、AT+CWSTARTSMART OK 智能连接路由器;
3、AT+CWSTOPSMART OK 关闭连接路由器;
3、AT+CIFSR OK 查询模块自身IP;
AT+CIFSR
+CIFSR:STAIP,"192.168.0.108"
+CIFSR:STAMAC,"18:fe:34:db:0d:33"
OK
4、AT+CIPSTART=0,"TCP","192.168.1.2",9955 OK/ERROR/ALREADY CONNECT 连接TCP服务器
4、AT+CIPCLOSE=5 OK/ERROR 关闭所有连接
5、AT+CIPSEND=x,len:ddddd OK+"> " 发送数据: x= 网络连接ID号(0~4)用于多连接的情况
5、+IPD,0,len:www.ifish7.com 接收数据;len是数据长度(MAX=2048)
*/
/**********************************************/
// 函数功能:UART2的接收中断服务程序 1byte
// 输入参数:无
// 输出参数:无
// 返 回 值:无
/**********************************************/
@far @interrupt void UART2_Recv_IRQHandler (void)
{
unsigned char i;
// flag_Receive_NewFrame_Buffer0=1;
if(Receive_Count0>119)
Receive_Count0=0;
if(Receive_Count1>119)
Receive_Count1=0;
if(1==flag_WiFi_Data_Sending||0==InBuffer_ID)
{
Receive_Buffer0[Receive_Count0++]=UART2_DR;// 读入接收到的字符0 针对系统
Receive_NewFrame_TimeoutCounter=0;
flag_Receive_NewOneByte=1;
}
else
Receive_Buffer1[Receive_Count1++]=UART2_DR;// 读入接收到的字符1 针对单命令
/*
if(1==InBuffer_ID)
{
Receive_Buffer1[Receive_Count1++]=UART2_DR;// 读入接收到的字符1 针对单命令
}
else
{
Receive_Buffer0[Receive_Count0++]=UART2_DR;// 读入接收到的字符0 针对系统
Receive_NewFrame_TimeoutCounter=0;
flag_Receive_NewOneByte=1;
}
*/
return;
}
/**********************************************/
// 函数功能:UART2的发送中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
/**********************************************/
@far @interrupt void UART2_Send_IRQHandler (void)
{
if(flag_WiFi_Data_Sending==1)
{
if(Send_Count<=Send_Num)
UART2_DR = Send_Buffer[++Send_Count];
else
{
flag_WiFi_Data_Sending=0;
UART2_CR2&= 0x7f; //TIEN=0:发送中断使能被禁止;
}
}
return;
}
void Display_T(void)
{
unsigned char temp,lcd_high4,lcd_low4;
// 时间小时个位值;SEG0+SEG8-8:
if(flag_LampTimeSetting)
{
if(flag_TimeSetup_Jump)
temp=0x0;
else if(flag_Open_Time)
temp=Lcd_Table0123456789[Set_Open_Hour[(LampTimeSetup_Stepper-1)/2]%10];
else if(flag_Close_Time)
temp=Lcd_Table0123456789[Set_Close_Hour[(LampTimeSetup_Stepper-1)/2]%10];
}
else if(flag_ClockTimeSetting)
{
if(flag_TimeSetup_Jump&&ClockTimeSetup_Stepper==8)
temp=0x0;
else
temp=Lcd_Table0123456789[Disp_Hour%10];
}
else
temp=Lcd_Table0123456789[Disp_Hour%10];
lcd_high4=(temp&0xf0)>>4;
lcd_low4=temp&0xf;
if(flag_Colon_Jump){lcd_high4=lcd_high4|0x1;} // COL标记“:”,跳闪
ht_writedata(0,lcd_high4,4); // SEG0:11A11B11C+COL
ht_writedata(8,lcd_low4,4); // SEG8:11F11G11E11D
// K1=”()”,K2=”( )”,K3=”( )”=>router ,WiFi=“WiFi”=>server :SEG30
lcd_low4=0x00;
if((flag_WiFi_ready&&flag_WiFi_Connect_Enable)||flag_WiFi_Disconnect)
{
if(flag_TCP0_Connected)
{lcd_low4|=0x01;}
else
{
if(flag_Colon_Jump)
lcd_low4|=0x01;
else
lcd_low4&=0x00;
}
if(flag_WiFi_Connected)
{lcd_low4|=0x0e;}
else
{
if(flag_Colon_Jump)
lcd_low4|=0x0f;
else
lcd_low4&=0x00;
}
if(flag_WiFi_Disconnect)
{lcd_low4|=0x01;}
}
ht_writedata(30,lcd_low4,4); // SEG30:K1+K2+K3+WiFi:"(((WiFi)))"
}
/**********************************************/
// 函数功能:定时器4的更新中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无 16.32ms【3MS】进一次TIM4中断,
/**********************************************/
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)//2MHZ/128/255/
{
TIM4_SR = 0x00; // 清除更新标志
//PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反
// //LED闪烁频率=2MHZ/128/255/2=30.63
// 1. 基本时间片= 50*3=150ms
if(++ThreeMS_Counter>=50)
{
ThreeMS_Counter=0;
// 1.0 跳闪设置
if(flag_TCP0_Connected==0&&flag_WiFi_Connected)
{
if(++TCP0_TimeoutCounter>=400) //150ms*400=60s
{
TCP0_TimeoutCounter=0;
//ESP8266_RST();
IWDG_Enable();
}
}
if(flag_TCP0_Connected)TCP0_TimeoutCounter=0;
// 1.1 跳闪设置
flag_TimeSetup_Jump=~flag_TimeSetup_Jump;
if(++Lcd_Colon_TimeoutCounter>5) // 600ms
{
Lcd_Colon_TimeoutCounter=0; // 灯光跳闪三部曲
flag_Colon_Jump=~flag_Colon_Jump; // ClockTime秒跳,":","(((WiFi)))"
//Display_T();
}
// 1.2 串口RS232连接超时 //50*3*40=6000ms
if(++RS232_TimeoutCounter>=40&&flag_RS232_TimeoutStart)
{
RS232_TimeoutCounter=0;
flag_RS232_TimeoutStart=0;
flag_RS232_Timeout=1;
}
if(flag_RS232_TimeoutStart==0)RS232_TimeoutCounter=0;
// 1.3 按键解屏 //50*3*15=2250ms
if(flag_ScreenLock_Status&&flag_have_key)
{
if(++UnLockScreen_TimeoutCounter>=15)
{
if(flag_ScreenLock_Status)
flag_ScreenLock_Status=0;
UnLockScreen_TimeoutCounter=0;
}
}
if(flag_ScreenLock_Status==0)UnLockScreen_TimeoutCounter=0;
// 1.4 手动自动切换 //50*3*10=1500ms
if(flag_auto_hand_change&&flag_have_key)
{
if(++auto_hand_TimeoutCounter>=10)
{
if(flag_auto_hand_change)
flag_auto_hand_change=0;
auto_hand_TimeoutCounter=0;
}
}
if(flag_auto_hand_change==0)auto_hand_TimeoutCounter=0;
// 1.5 超时锁屏 //50*3*50=7500ms
if(flag_ScreenLock_Status==0)//&&flag_auto_hand_change==0)
{
if(++LockScreen_TimeoutCounter>=50)
{
flag_ScreenLock_Status=1;
LockScreen_TimeoutCounter=0;
if(flag_ClockTimeSetting)
{
flag_ClockTimeSetting=0;
ClockTimeSetup_Stepper=0;
}
if(flag_LampTimeSetting)
{
flag_LampTimeSetting=0;
LampTimeSetup_Stepper=0;
flag_Open_Time=0;
flag_Close_Time=0;
}
}
}
if(flag_ScreenLock_Status)LockScreen_TimeoutCounter=0;
// 1.6 约10s心跳包 //50*3*68=10200ms Connect_TCP_Counter=0;
if(flag_TCP0_Connected&&flag_WiFi_Connected&&flag_TCP_Logined)
{
if(++HeartBeat10s_TimeoutCounter>68)
{
HeartBeat10s_TimeoutCounter=0;
flag_HeartBeat10s=1;
}
}
if(flag_TCP_Logined==0)HeartBeat10s_TimeoutCounter=0;
// 长时间60s没有心跳、服务器、路由器,看门狗复位
if(flag_HeartBeat10s&&flag_TCP0_Connected&&flag_WiFi_Connected)
{
HeartBeat_0_TimeoutCounter=0;
if(++HeartBeat_1_TimeoutCounter>400)
{
HeartBeat_1_TimeoutCounter=0;
//ESP8266_RST();
IWDG_Enable();
}
}
else if(flag_HeartBeat10s==0&&flag_TCP0_Connected&&flag_WiFi_Connected)
{
HeartBeat_1_TimeoutCounter=0;
if(++HeartBeat_0_TimeoutCounter>400)
{
HeartBeat_0_TimeoutCounter=0;
//ESP8266_RST();
IWDG_Enable();
}
}
// 1.7 连接服务器失败,一直约10s重连10次;
if(flag_Restart_Connect_TCP)
{
if(++Restart_Connect_TCP_TimeoutCounter>90)
{
Connect_TCP_Counter++;
Restart_Connect_TCP_TimeoutCounter=0;
flag_Enable_Connect_TCP=1;
}
}
if(flag_Restart_Connect_TCP==0)Restart_Connect_TCP_TimeoutCounter=0;
// 连接路由失败,10s后路由复位连接
if(flag_WiFi_Disconnect)
{
if(++WiFi_Disconnect_TimeoutCounter>90)
{
WiFi_Disconnect_TimeoutCounter=0;
//ESP8266_RST();
IWDG_Enable();
}
}
if(flag_have_key) WiFi_Disconnect_TimeoutCounter=0;
// 1.8 上电若ready设置flag_ready_Monitoring5s=1,若5s无入网信息, 则重新启动智能入网,设置flag_ready5s_STARTSMART=1
if(flag_ready_Monitoring5s&&flag_WiFi_ready)
{
if(++NoWiFi5s_TimeoutCounter>34)
{
NoWiFi5s_TimeoutCounter=0;
flag_ready5s_STARTSMART=1;
}
}
if(flag_ready_Monitoring5s==0)NoWiFi5s_TimeoutCounter=0;
// 1.9 发出登陆指令设置flag_NoLoginBack_Monitoring150s=1,若150s没有返回网络时间,则重新启动连接服务器,设置flag_NoLoginBack150s_CIPSTART=1
//if((flag_NoLoginBack_Monitoring150s&&flag_TCP0_Connected&&flag_WiFi_Connected))
if(flag_NoLoginBack_Monitoring150s)//||(flag_TCP0_Connected==0&&flag_WiFi_Connected))
{
if(++NoLoginBack150s_TimeoutCounter>1000)
{
NoLoginBack150s_TimeoutCounter=0;
flag_NoLoginBack150s_CIPSTART=1;
//ESP8266_RST();
//IWDG_Enable();
}
}
else NoLoginBack150s_TimeoutCounter=0;
// 1.9 上电若DISCONNECT设置flag_DisConnect_Monitoring180s=1,若180s无入网信息, 则复位模块,设置flag_DisConnect180s_StartRST=1
// if(flag_DisConnect_Monitoring180s&&flag_WiFi_Connect_Enable)
// {
// if(++DisConnect180s_TimeoutCounter>400) //1200
// {
// DisConnect180s_TimeoutCounter=0;
// flag_DisConnect180s_StartRST=1;
// }
// }
// if(flag_DisConnect_Monitoring180s==0)DisConnect180s_TimeoutCounter=0;
}
// 2.串口接收时间片 // 3*3=9ms没有再收到新的字符,认为前面一帧结束
if(flag_Receive_NewOneByte)
{
if(++Receive_NewFrame_TimeoutCounter>10) // 超时处理,一帧数据收集完毕
{
Receive_NewFrame_TimeoutCounter=0;
flag_Receive_NewOneByte=0; // =1UART接收1个新的字符;?
flag_Receive_NewFrame_Buffer0=1; // =1表明接收完了一帧新字符
Receive_Num0=Receive_Count0;
Receive_Count0=0;
}
}
/*
if(flag_Buzzer)
{
//flag_Buzzering=1;
if(++Buzzer_TimeoutCounter>5)
{
flag_Buzzer=0;
//flag_Buzzering=0;
ht_writecmd(Command, toneoff);
Buzzer_TimeoutCounter=0;
}
}
*/
return;
}