嵌入式系统实践 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>相关文章:
嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板
物联网实验1 阿里云远程控制小灯 ///****************************************************************************** // * // * MSP432P401 // * ----------------- // * | | // * | |…...
【密码学篇】密码行业标准汇总(GM)
【密码学篇】密码行业标准汇总(GM) 截止到2023年03月10日,共130个密码行业标准,适用商用密码应用与安全性评估等密码行业,可点击链接预览或下载标准—【蘇小沐】 文章目录【密码学篇】密码行业标准汇总(GM…...
桌面文件删除后没有在回收站原因和恢复方法
桌面误删文件回收站也没有怎么办?遇到电脑桌面文件误删了,重要数据回收站找不回这种情况不要慌!如今数据恢复技术很成熟,许多文件丢失问题都能够成功解决。下面我们就一起来了解下桌面误删文件回收站没有的原因和相关文件恢复方法…...
什么是业务运营?关键组成部分有哪些?
企业领导者使用收入运营和智能软件等技术来分析买家的不同接触点。这些见解决定了客户互动的成败,从而改善了业务运营,从而带来了成功。 什么是业务运营? 业务运营包括企业为保持盈利而执行的一系列日常任务。虽然这些任务可能因业务类型或行…...
腾讯云新用户怎么配置服务器的方法教程
腾讯云新用户怎么配置服务器?腾讯云服务器配置选择攻略,先选择云服务器地域和可用区,然后根据用户使用场景需要平衡型、计算型或高IO型等特性来选择云服务器CVM实例规格,主机教程网来详细说下腾讯云服务器配置选择攻略。 1、腾讯云…...
windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(共同局域网下,另一台主机不需要联网)
windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(不需要联网)问题来源问题分析解决方案问题来源 自己搭建了一台ubuntu系统作为深度学习的机器,但是学校的网络问题,一个账号只能同时登录3台设备。通过远程连接…...
头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析
文章目录1 MyBatis中Controller层List集合接收数据,泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收?1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,…...
vue-cropper 拖动图片和截图框
现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true,表示可以拖动截图框 can-move设置为true,表示可以拖动图片 *注意: 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高,否则移动不了…...
[Linux基础]history相关的环境变量设置
目录 背景 简介 命令操作 1. 语法: 2. 功能 3. 参数 环境变量设置 背景 工作中时常收到客户的反馈,我的系统什么也没干,就出现文件丢失,程序错误等等问题;我们在问题排查的时候查看history信息也是重要环节…...
怎么给电脑分盘与合并磁盘?教你三招
电脑只有一个C盘,想要再分出一个或多个分区,怎么办?电脑C盘的容量太小,太容易满了,想重新分盘,或者把其他盘跟它合并,但因为文件太多备份实在是太麻烦,怎么办?怎么给电脑…...
HCIP-5.4OSPF路由聚合、缺省路由
1、路由聚合 OSPF 是一种链路状态路由协议,因此 OSPF路由器不传输路由,而是传输链路状态信息。因此,OSPF 路由通过汇总 LSA 来控制链路状态信息的传输,从而减小 LSDB 数据库的大小,进而控制路由的汇总。 由于OSPF路由…...
【数据结构】——树与二叉树
文章目录树二叉树二叉树的性质完全二叉树二叉树的存储遍历二叉树和线索二叉树6.4 树和森林哈夫曼树应用树 树的定义:树是以分支关系定义的层次结构。 D; 树(Tree)是n(n≥0)个结点的有限集。 R 数据关系 有且仅有一个特定的称为根(Root) 的结点 当n>1时&…...
等离子纳秒高压脉冲电源维修HVP-20 P
等离子纳秒高压脉冲电源维修HVP-20 P;HVP-10B;HVP-05;HVP-02等型号均可维修 HVP-20 P(N)用于气体放电与低温等离子体的高性能纳秒高压脉冲电源。 HVP-20P(N)采用专有的marx电路,实现高压脉冲电源参数的便捷可调,包括峰值电压0 – 20 KV (-2…...
JavaScript内改变this指向
之前我们说的都是代码内 this 的默认指向今天我们要来说一下如何能改变 this 指向也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪开局在函数的原型( Function.prototype ) 上有三个方法callapplybind既然是在函数的原型上, 那么只要是函数就可以调用这三个方法…...
Cobalt Strike---(2)
数据管理 Cobalt Strike 的团队服务器是行动期间Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来 自它的 Beacon payload 的输出,提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据,通过 Reporting → Export Data 。Cobalt Str…...
docker的命令使用和相关例子
Docker是一种流行的容器化平台,可以帮助开发人员更轻松地构建、发布和管理应用程序。下面是一些Docker的命令使用和相关例子: Docker镜像相关命令: 搜索Docker镜像: docker search 例子:docker search ubuntu 下载D…...
23模式--代理模式
本篇主要聊一些23中模型中的代理模式: 看一下百度百科的解释: 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目…...
【Linux】信号的产生、保存、捕捉处理 (四种信号产生、核心存储、用户态与内核态、信号集及其操作函数)
文章目录1、什么是信号?2、信号的产生2.1 通过键盘产生信号2.2 通过系统调用产生信号2.3 硬件异常产生的信号2.4 由软件条件产生的信号2.5 进程的核心转储3、信号的保存4、信号的捕捉4.1 用户态和内核态4.2 用户态到内核态的切换4.3 信号捕捉过程5、信号集操作函数以…...
redis经典五种数据类型及底层实现
目录一、Redis源代码的核心部分1.redis源码在哪里2.src源码包下面该如何看?二、我们平时说redis是字典数据库KV键值对到底是什么1.6大类型说明(粗分)2.6大类型说明3.上帝视角4.Redis定义了redisObject结构体4.1 C语言struct结构体语法简介4.2 字典、KV是什么4.3 red…...
三十而立却被裁,打工人要如何应对职场危机?
又到金三银四就业季,对于部分职场人来说,年龄成为了他们找工作的最大限制。 因为绝大部分企业招聘中层干部以下岗位的时候,都会要求年龄不超过35周岁,再加上每年千万毕业生涌入社会,竞争程度相当激烈,这就导…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
