嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板
物联网实验1
阿里云远程控制小灯
///******************************************************************************
// *
// * MSP432P401
// * -----------------
// * | |
// * | |
// * | |
// * RST -| P1.3/UCA0TXD|----> PC
// * | |
// * | |
// * | P1.2/UCA0RXD|<---- PC
// * | |
// *
// *******************************************************************************/
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "tick.h"
#include "myUart.h"
#include "buffer.h"
#include "ATCommand.h"
#include "cJSON.h"
#include "exti.h"
#include "led.h"
#include "oled.h"
#define _debug_ //Debug模式:需要获取AT指令执行详细信息时打开,注意供电不足时打开可能会导致串口频繁崩溃/*请填充以下信息*//* 定义Wi-Fi路由信息 */
const char* wifi_ssid = "HONOR 30";
const char* wifi_pwd = "treasure3";/* 定义四元组信息 */
const char* ProductKey = "i34te8zl80V";
const char* DeviceName = "led0";
const char* DeviceSecret = "7cb89003811b8a485fd97156b22b0fc8";
const char* ProductSecret = "ixwudEccQ5uW53rr";/*请填充以上信息*/#define BLANK_DATA " "
#define LINE_SIZE 16
#define MaxCommandLength 100char exti1 = 0; //外部中断标志位
char ATCommandBuffer[MaxCommandLength];
int led_switch = 0; //初始LED状态值/* 打开微库 Options->Target->Code Generation->Use MicroLIB */
int fputc(int ch, FILE *f)
{MAP_UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);return ch;
}/* 上报属性至云端 */
int ReturnData(void)
{cJSON *JsonCommand = cJSON_CreateObject();cJSON *SendJson = cJSON_CreateObject();cJSON_AddStringToObject(JsonCommand, "id", "10001001");cJSON_AddNumberToObject(JsonCommand, "PowerSwitch", led_switch); //LED状态值cJSON_AddStringToObject(JsonCommand, "version", "1.0");cJSON_AddStringToObject(JsonCommand, "method", "thing.event.property.post"); char *command = cJSON_PrintUnformatted(JsonCommand); //打印Json命令cJSON_AddStringToObject(SendJson, "send_cmd", command); //序列化Json命令cJSON *send_cmd = cJSON_GetObjectItem(SendJson, "send_cmd"); //只获取Json命令内容char *send_str = cJSON_PrintUnformatted(send_cmd); //打印Json命令内容AT_Send_message(send_str); //发送AT上报属性free(command);free(send_cmd);free(send_str);cJSON_Delete(SendJson); //释放Json命令内容cJSON_Delete(JsonCommand); //释放Json命令return true;
}int RemoveWireless(void)
{OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 1", LINE_SIZE);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wireless... ", LINE_SIZE);if(!Stop_WiFi_Connection()) //停止Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wi-Fi Error!", LINE_SIZE);led2blink(Red, 3, 500);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, BLANK_DATA, LINE_SIZE);exti1 = 0;return 1;}else{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove SSID.....", LINE_SIZE);AT_Remove_SSID(ATCommandBuffer, MaxCommandLength); //删除SSIDexecAT(ATCommandBuffer);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTIDexecAT(ATCommandBuffer);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Wi-Fi Removed.", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Press RESET Key.", LINE_SIZE); }exti1 = 0;return 0;
}int main(void)
{/* 停用开门狗 */MAP_WDT_A_holdTimer();/* Simple FPU Config */ MAP_FPU_enableModule(); /*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/ MAP_CS_setDCOFrequency(4000000); /* 设置DCO频率为指定频率,此处DCO=4M*/MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1); /*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=4M*/MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO/4=1M*/MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4); /*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/4=1M*//* 初始化systick中断,从而获得精准的delayms延时 */ms_ticker_init();MAP_SysTick_enableModule();MAP_SysTick_enableInterrupt();LED_Init(); //初始化LEDmyUartInit(); //初始化所有串口 EXTIX_Init(); //初始化外中断Beep_Init(); //初始化蜂鸣器OLED_Init(); //初始化OLED屏幕OLED_Clear(); //OLED清屏printf("Starting Wi-Fi Module...");OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 1", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Starting Wi-Fi..", LINE_SIZE);delay_ms(12000); //等待Wi-Fi模组连接云端#ifndef _debug_MAP_UART_disableModule(EUSCI_A0_BASE); //如果没定义debug标志,则关闭调试串口
#endif/* 建立连接 */while(1){led2ShowRed(); //LED亮红灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Checking Wi-Fi..", LINE_SIZE);if(!Check_WiFi_Connection()) //检查Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connection fail!", LINE_SIZE);led2blink(Red, 3, 500); //红灯闪烁表示Wi-Fi连接失败/* 注册设备三元组 */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Device Register.", LINE_SIZE); AT_Device_Register(ATCommandBuffer, MaxCommandLength, \ProductKey, DeviceName, DeviceSecret, ProductSecret);execAT(ATCommandBuffer);delay_ms(1000);/* 连接Wi-Fi */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connecting Wi-Fi", LINE_SIZE);AT_Connect_WiFi(ATCommandBuffer, MaxCommandLength, wifi_ssid, wifi_pwd); //重新连接Wi-FiexecAT(ATCommandBuffer);delay_ms(14000); //等待Wi-Fi模组连接云端}else{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Wi-Fi Connected.", LINE_SIZE);led2ShowGreen(); //LED2亮绿灯break;}}GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1); //P2.1输出高电平,LED2亮绿灯myEUSCIA0Init(); //初始化A0串口printf("------ Connection finished. ------\r\n");while(1){MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1); //LED2绿灯交替闪烁delay_ms(300); //交替闪烁间隔/* 判断是否关机状态 */if(exti1 == 1){ //按下按键S1可以关闭3080GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1); //P2.1输出高电平,LED2中绿灯亮execAT("AT+IDMCLS\r\n");printf("------Power off-----\r\n");OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "-- Power Off ---", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Press RESET Key.", LINE_SIZE);GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1); //P2.1输出低电平,LED2中绿灯灭break;}else if(exti1 == 2){RemoveWireless();break;}char *Sub_Json_ptr = AT_Get_SUB_In_Json(&myBuffer); //获取云端下发数据if(Sub_Json_ptr != NULL){ //收到物联网平台下发jsoncJSON *praseDataPtr = cJSON_Parse(Sub_Json_ptr); //解析下发属性值cJSON *PowerSwitch = cJSON_GetObjectItem(praseDataPtr, "PowerSwitch"); //获取LED开关值if(cJSON_IsNumber(PowerSwitch)) //测试开关值是否为Int型{led_switch = PowerSwitch->valueint; //获取开关值if(led_switch == 0){printf("Turn off the light.\r\n");MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); //关闭LED灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: OFF", LINE_SIZE);}else if(led_switch == 1){printf("Turn on the light.\r\n");MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0); //开启LED灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: ON ", LINE_SIZE);}ReturnData(); //上报属性至云端}cJSON_Delete(praseDataPtr);}}while(1); //停机
}
实验2
分析整个物联网应用数据流转的过程
s1,s2组成2种组合(任意一个按钮打开及2个按钮都打开),控制msp432红灯的亮度(PWM降低),当成功调节亮度后物联网开发板蜂鸣器(5.5连接buzer)响1s。
web前端添加时间字段,固件端设置新定时器,每隔一秒刷新一次前端时间数据,且可以通过pc(uart工具)设置初始时间。(提示:前端页面新增3个不可控int字段,表示时分秒,其他和之前的时钟操作类似,可参考定时器章节设置定时器)
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "i2c.h"
#include "tick.h"
#include "myUart.h"
#include "myTimer.h"
#include "buffer.h"
#include "ATCommand.h"
#include "cJSON.h"
#include "exti.h"
#include "led.h"
#include "oled.h"
#include "hts221.h"
#include "sw.h"
#include "beep.h"#define _debug_ //Debug模式:需要获取AT指令执行详细信息时打开,注意供电不足时打开可能会导致串口频繁崩溃/* 定义Wi-Fi路由信息 */
const char* wifi_ssid = "HONOR 30";
const char* wifi_pwd = "treasure3";/* 定义四元组信息 */
const char* ProductKey = "g5tk1FRbp5v";
const char* ProductSecret = "JSdWdXhHffVKYvxX";
const char* DeviceName = "10205102444";
const char* DeviceSecret = "16ebf3ebb9f84531dc28cbb681cf8700";#define BLANK_DATA " "
#define LINE_SIZE 16
#define MaxCommandLength 150
extern char exti1; //外部中断标志位char ATCommandBuffer[MaxCommandLength];
char UserCommandBuffer[MaxCommandLength];
char SendMsgBuffer[128];
char OLED_BUFF[32];#define TA1_PERIODS (62500)
#define PWM_PERIODS (62500/50)const eUSCI_UART_Config uartConfig =
{EUSCI_A_UART_CLOCKSOURCE_SMCLK, //选用SMCLK(1M)时钟源6, // BRDIV = 6 ,clockPrescalar时钟分频系数 8, // UCxBRF = 8 firstModReg (BRDIV、UCxBRF、 UCxBRS和SMCLK,用于设置串口波特率)17, // UCxBRS = 17 secondModRegEUSCI_A_UART_NO_PARITY, // 校验位NoneEUSCI_A_UART_LSB_FIRST, // 低位优先,小端模式EUSCI_A_UART_ONE_STOP_BIT, // 停止位1位EUSCI_A_UART_MODE, // UART modeEUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION // 设置为过采样,该数值为1
};const Timer_A_UpModeConfig TA0 =
{TIMER_A_CLOCKSOURCE_SMCLK, // 选用SMCLK作为时钟源TIMER_A_CLOCKSOURCE_DIVIDER_1, // 分频系数为1,Timer_A0=SMCLK/1=62.5kPWM_PERIODS - 1, // 周期时长=PWM_PERIODS/Timer_A0=20ms(注:视觉暂留时间约为100ms至400ms),因从零开始计数,建议做减一操作;TIMER_A_TAIE_INTERRUPT_DISABLE, // 禁用定时器中断TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE, // 禁用定时器CCR0中断TIMER_A_DO_CLEAR // 清空数值
};Timer_A_CompareModeConfig TA0_CCR1_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_1, // CCR1通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET, // 采用复位/置位PWM_PERIODS // 占空比,此处不用减一,当定时器数值val<dutyCycle时,输出高电平(即0到dutyCycle-1,共dutyCycle);当val>=dutyCycle时输出低电平
};Timer_A_CompareModeConfig TA0_CCR2_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_2, // CCR2通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET, // 采用复位/置位PWM_PERIODS
};Timer_A_CompareModeConfig TA0_CCR3_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_3, // CCR3通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET, // 采用复位/置位PWM_PERIODS
};//打开微库 Options->Target->Code Generation->Use MicroLIB
int fputc(int ch, FILE* f) {MAP_UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);return ch;
}/* 上报属性至云端 */
int ReturnData(char* message) {cJSON* JsonCommand = cJSON_CreateObject();cJSON* SendJson = cJSON_CreateObject();cJSON_AddStringToObject(JsonCommand, "DATA", message);char* command = cJSON_PrintUnformatted(JsonCommand); //打印Json命令cJSON_AddStringToObject(SendJson, "send_cmd", command); //序列化Json命令cJSON* send_cmd = cJSON_GetObjectItem(SendJson, "send_cmd"); //只获取Json命令内容char* send_str = cJSON_PrintUnformatted(send_cmd); //打印Json命令内容AT_Send_message(send_str); //发送AT上报属性free(command);free(send_cmd);free(send_str);cJSON_Delete(SendJson); //释放Json命令内容cJSON_Delete(JsonCommand); //释放Json命令return true;
}/* 解析控制命令 */
bool PraseCommand(char* cmd) {char* ptr = NULL;ptr = strtok(cmd, ","); //分隔命令字段while (ptr) {if (!strcmp(ptr, "Light")) {ptr = strtok(NULL, ",");if (!strcmp(ptr, "1")) {tunnOnLed1(); //开启LED1灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: ON ", LINE_SIZE);}else if (!strcmp(ptr, "0")) {turnOffLed1(); //关闭LED1灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: OFF", LINE_SIZE);}}ptr = strtok(NULL, ","); //分隔命令字段}//exti1 = 1; //触发外部中断return true;
}int RemoveWireless(void) {OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 2", LINE_SIZE);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wireless... ", LINE_SIZE);if (!Stop_WiFi_Connection()) //停止Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wi-Fi Error!", LINE_SIZE);led2blink(Red, 3, 500);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, BLANK_DATA, LINE_SIZE);exti1 = 0;return 1;}else {OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove SSID.....", LINE_SIZE);AT_Remove_SSID(ATCommandBuffer, MaxCommandLength); //删除SSIDexecAT(ATCommandBuffer);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTIDexecAT(ATCommandBuffer);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Wi-Fi Removed.", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Press RESET Key.", LINE_SIZE);}exti1 = 0;while (1); //停机
}void pwninit()
{uint8_t port_mapping[] ={PM_TA0CCR1A, //映射至Timer_A0_CCR1,与Pin0对应PM_TA0CCR2A, //映射至Timer_A0_CCR2,与Pin1对应PM_TA0CCR3A, //映射至Timer_A0_CCR3,与Pin2对应PM_NONE, //不映射,映射为空PM_NONE,PM_NONE,PM_NONE,PM_NONE};MAP_PMAP_configurePorts((const uint8_t*)port_mapping, PMAP_P2MAP/*端口2*/, 1/*8个引脚*/, PMAP_DISABLE_RECONFIGURATION);MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);MAP_Timer_A_configureUpMode(TIMER_A0_BASE, &TA0);Interrupt_enableMaster(); /*使能主中断*/MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);myEUSCIA0Init(); //初始化A0调试串口TA0_CCR1_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);printf("------ Connection finished. ------\r\n");MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT); /*使能UART_A0串口接收中断*/MAP_Interrupt_enableInterrupt(INT_EUSCIA0); /*使能UART_A0中断*/
}int main(void) {int Temp = 0; //定义温度初值int Humi = 0; //定义湿度初值int led1_stat = 0; //定义LED灯初值int sw1_stat = 0; //定义S1开关初值int sw2_stat = 0; //定义S2开关初值/* 停用开门狗 */MAP_WDT_A_holdTimer();MAP_FPU_enableModule();/*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/MAP_CS_setDCOFrequency(4000000);/* 设置DCO频率为指定频率,此处DCO=4M*/MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);/*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=4M*/MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO/4=1M*/MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/4=1M*//* 初始化systick中断,从而获得精准的delayms延时 */ms_ticker_init();MAP_SysTick_enableModule();MAP_SysTick_enableInterrupt();//systick configLED_Init(); //初始化LED灯switchInit(); //初始化按键开关myUartInit(); //初始化用户串口EXTIX_Init(); //初始化外部中断Beep_Init(); //初始化蜂鸣器i2c_init(NULL); //初始化I2C总线HTS221_Init(); //初始化温湿度传感器OLED_Init(); //初始化OLED显示屏OLED_Clear(); //OLED清屏timer0Init(4000000);printf("Starting Wi-Fi Module...");OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 2", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Starting Wi-Fi..", LINE_SIZE);delay_ms(12000); //等待Wi-Fi模组连接云端#ifndef _debug_MAP_UART_disableModule(EUSCI_A0_BASE); //如果没定义debug标志,则关闭调试串口
#endif/* 建立连接 */while (1) {led2ShowRed(); //LED亮红灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Checking Wi-Fi..", LINE_SIZE);if (!Check_WiFi_Connection()) //检查Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connection fail!", LINE_SIZE);led2blink(Red, 3, 500); //红灯闪烁表示Wi-Fi连接失败/* 注册设备三元组 */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Device Register.", LINE_SIZE);AT_Device_Register(ATCommandBuffer, MaxCommandLength, \ProductKey, DeviceName, DeviceSecret, ProductSecret);execAT(ATCommandBuffer);delay_ms(1000);/* 连接Wi-Fi */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connecting Wi-Fi", LINE_SIZE);AT_Connect_WiFi(ATCommandBuffer, MaxCommandLength, wifi_ssid, wifi_pwd); //重新连接Wi-FiexecAT(ATCommandBuffer);delay_ms(14000); //等待Wi-Fi模组连接云端}else {OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Wi-Fi Connected.", LINE_SIZE);led2ShowGreen(); //LED2亮绿灯delay_ms(3000);break;}}pwninit();while (1) {delay_ms(100); //交替闪烁间隔/* SW开关状态变动事件 */if (sw1_stat != getS1Status() || sw2_stat != getS2Status()) {exti1 = 1; //触发外部中断}if (exti1 == 1) {Temp = HTS221_Get_Temperature(); //获取温度值Humi = HTS221_Get_Humidity(); //获取湿度值led1_stat = getLed1Status(); //获取LED1开关值sw1_stat = getS1Status(); //获取SW1开关值sw2_stat = getS2Status(); //获取SW1开关值memset(SendMsgBuffer, 0, sizeof(SendMsgBuffer));/* 打包上报属性字符串 */sprintf(SendMsgBuffer, "Temp,%d,Humi,%d,Light,%d,Switch1,%d,Switch2,%d", \Temp, Humi, led1_stat, sw1_stat, sw2_stat);ReturnData(SendMsgBuffer); //上报属性至云端memset(OLED_BUFF, 0, sizeof(OLED_BUFF));sprintf(OLED_BUFF, "Temp:%d Humi:%d ", Temp, Humi);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, OLED_BUFF, LINE_SIZE); //OLED显示温湿度值memset(OLED_BUFF, 0, sizeof(OLED_BUFF));OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, OLED_BUFF, LINE_SIZE); //OLED显示温湿度值OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Reporting Data..", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, BLANK_DATA, LINE_SIZE); //OLED清空第四行if (sw1_stat && sw2_stat) {TA0_CCR1_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);Play_Successful();}else if (sw1_stat || sw2_stat) {TA0_CCR1_PWM.compareValue = PWM_PERIODS * 3000.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 3000.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 3000.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);Play_Successful();}exti1 = 0; //清除按键中断标志}else if (exti1 == 2) {RemoveWireless(); //删除Wi-Fi}char* Sub_Json_ptr = AT_Get_SUB_In_Json(&myBuffer); //获取云端下发数据if (Sub_Json_ptr != NULL) {//printf("Receive: %s\r\n", Sub_Json_ptr);cJSON* praseDataPtr = cJSON_Parse(Sub_Json_ptr); //解析下发属性值cJSON* DATA = cJSON_GetObjectItem(praseDataPtr, "DATA"); //获取控制命令字符串if (cJSON_IsString(DATA)) {memset(UserCommandBuffer, 0, sizeof(UserCommandBuffer));memcpy(UserCommandBuffer, DATA->valuestring, strlen(DATA->valuestring)); //复制命令字符串PraseCommand(UserCommandBuffer); //解析控制命令}cJSON_Delete(praseDataPtr);}}
}int h = 0;
int m = 0;
int s = 0;
int time = 0;
int idx = 0;
int num = 0;/*UART_A0中断函数*/
void EUSCIA0_IRQHandler(void) {char tmp[3] = {0};uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE); /*将UART_A0中断标志位的值赋值给status*/MAP_UART_clearInterruptFlag(EUSCI_A0_BASE, status);/*清空UART_A0中断标志位*/if (status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) /*判断是否为UART_A0接受中断*/{sprintf(tmp, "%c", MAP_UART_receiveData(EUSCI_A0_BASE));if (tmp[0] == 'g') {time = 1;}else if (tmp[0] == 'h') {time = 2;}else if (tmp[0] == 'm') {time = 3;}else if (tmp[0] == 's') {time = 4;}if (tmp[0] >= '0' && tmp[0] <= '9' && idx <= 2) {num *= 10;num += tmp[0] - '0';++idx;}}
}
#include<bits/stdc++.h>
void T32_INT1_IRQHandler(void) {MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE); /*清除Timer32第一个计数器中断标志*/if (time == 0) return;if (time == 1) {s++;if (s >= 60) {s -= 60;m++;}if (m >= 60) {m -= 60;h++;}if (h >= 24) {h -= 24;}sprintf(SendMsgBuffer, "hh:%02d mm:%02d ss:%02d", h, m, s);ReturnData(SendMsgBuffer); //上报属性至云端}else if (time == 2 && num < 24) {h = (24 + num) % 24;}else if (time == 3 && num < 60) {m = (60 + num) % 60;}else if (time == 4 ) {s = (60 + num) % 60;}//sprintf(OLED_BUFF, "%d:%d:%d", h, m, s);}
前端代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>AIoT Test Demo</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="jquery.js"></script><script src="https://cdn.jsdelivr.net/npm/vue@2.7.10"></script><!-- <script src="https://cdn.jsdelivr.net/npm/vue"></script> -->
</head>
<body>
<div class="all"><div class="top"><ul class="navigation"><li><button onclick="openLight()">Light on</button></li><li><button onclick="closeLight()">Light off</button></li></ul></div><div class="cover"><div class="sub_frame"><div class="sub_cover"><div class="show"><div id="app"><div class="content">Light: {{Light}}</div><div class="content">Switch1: {{Switch1}}</div><div class="content">Switch2: {{Switch2}}</div><div class="content">Temp: {{Temp}}</div><div class="content">Humi: {{Humi}}</div></div><div class="content" id="message">WebsocketStatus: </div></div></div></div></div>
</div>
</body><script>var deviceName = '10205102444'function openLight() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=Light&targetValue=1","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}function closeLight() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=Light&targetValue=0","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}function sayhello() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=OLed&targetValue=1","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}var websocket = null;//判断当前浏览器是否支持WebSocketif ('WebSocket' in window) {// websocket = new WebSocket("ws://localhost:9999/connectWebSocket/" + deviceName + "/" + "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIiwiZXhwIjoxNjE3NzU4NTYwfQ.T-NnzLvSK9zykVKjatJqNPLeMGiYdfWME_v1UZy1uxQ");//连接WebSocket节点websocket = new WebSocket("wss://mxlab.mxchip.com:9999/connectWebSocket/" + deviceName + "/" + window.sessionStorage.getItem('token'));// websocket = new WebSocket("ws://localhost:8001");}else {alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function () {setMessageInnerHTML("Error");};//连接成功建立的回调方法websocket.onopen = function (event) {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/initData?deviceName=" + deviceName,"method": "GET","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {for (var key in response.data) {switch (key) {case "Light":app.Light = response.data[key]breakcase "Switch1":app.Switch1 = response.data[key]breakcase "Switch2":app.Switch2 = response.data[key]breakcase "Temp":app.Temp = response.data[key]breakcase "Humi":app.Humi = response.data[key]break}}console.log('init...')console.log(response);});setMessageInnerHTML("Open");}//接收到消息的回调方法websocket.onmessage = function (event) {console.log(event)var json = JSON.parse(event.data)for (var key in json) {switch (key) {case "Light":app.Light = json[key]breakcase "Switch1":app.Switch1 = json[key]breakcase "Switch2":app.Switch2 = json[key]breakcase "Temp":app.Temp = json[key]breakcase "Humi":app.Humi = json[key]break}}console.log(event.data);}//连接关闭的回调方法websocket.onclose = function () {setMessageInnerHTML("close");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function () {websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML) {document.getElementById('message').innerHTML += innerHTML + '<br/>';}var app = new Vue({el: '#app',data: {Light: 0,Switch1: 0,Switch2: 0,Temp: 0,Humi: 0}})
</script><style>
*{padding: 0;margin: 0;
}
a:link{color: aliceblue;text-decoration: none;
}
a:visited{color: aliceblue;text-decoration: none;
}
.all{width: 100%;margin: 0 auto;
}
.top{height: 45px;background-color: rgba(192,192,192,1.0);text-align: left;margin: 0 auto;
}
.top ul li{cursor: pointer;text-align: center;height: 100%;width: 30%;list-style-type: none;float: left;line-height: 45px;<!--"Comic Sans MS"-->font-family: "Comic Sans MS";
}.top button{font-family: "Comic Sans MS";color: black;font-size: 30px;width:90%;height: 100%;border-top:0px solid transparent;border-bottom:0px solid transparent;border-left:0px solid transparent;border-right:0px solid transparent;
}
.cover{width: 100%;height: 700px;background-image: url('salt.jpg');background-size: cover;opacity: 1.0;
}
.sub_frame{width: 700px;height: 700px;margin: 10px auto;position: relative;border: 5px darkgrey dotted;border-radius: 50%;top: 50%;transform: translateY(-50%);
}
.sub_cover{width: 650px;height: 650px;margin-top: 25px;margin-left: 25px;border-radius: 50%;background-color: rgba(192,192,192,0.5);<!---令子块居中--->display:flex;align-items:center;justify-content:center;position:absolute;
}.show{position:absolute;left:15%;top:15%;init...
}.content{font-family: "Comic Sans MS";color: black;font-size: 45px;}
</style>
</html>