嵌入式系统实践 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 100

char 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);		//删除SSID
		execAT(ATCommandBuffer);
		delay_ms(1000);
	
		OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);
		AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTID
		execAT(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();			//初始化LED
	myUartInit();		//初始化所有串口										
	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-Fi
			execAT(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可以关闭3080
			GPIO_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)
		{
    
    																															//收到物联网平台下发json
			cJSON *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 secondModReg
		EUSCI_A_UART_NO_PARITY,                  // 校验位None
		EUSCI_A_UART_LSB_FIRST,                  // 低位优先,小端模式
		EUSCI_A_UART_ONE_STOP_BIT,               // 停止位1位
		EUSCI_A_UART_MODE,                       // UART mode
		EUSCI_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.5k
		PWM_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);		//删除SSID
		execAT(ATCommandBuffer);
		delay_ms(1000);

		OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);
		AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTID
		execAT(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 config

	LED_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-Fi
			execAT(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/[email protected]"></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;


    //判断当前浏览器是否支持WebSocket
    if ('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]
                        break
                    case "Switch1":
                        app.Switch1 = response.data[key]
                        break
                    case "Switch2":
                        app.Switch2 = response.data[key]
                        break
                    case "Temp":
                        app.Temp = response.data[key]
                        break
                    case "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]
                    break
                case "Switch1":
                    app.Switch1 = json[key]
                    break
                case "Switch2":
                    app.Switch2 = json[key]
                    break
                case "Temp":
                    app.Temp = json[key]
                    break
                case "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>

猜你喜欢

转载自blog.csdn.net/JamSlade/article/details/129416541