} Motor;
/*motor.c*/
#define STEPS_PER_REVOLUTION 4096
const uint8_t Steps[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};
void setup_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void motor_step(Motor* motor)
{
if (motor->direction != STOPPED)
{
if (motor->direction == FORWARD)
{
GPIO_Write(GPIOA, Steps[motor->step]);
motor->step = (motor->step + 1) % 8;
}
else
{ // BACKWARD
GPIO_Write(GPIOA, Steps[motor->step]);
motor->step = (motor->step - 1 + 8) % 8;
}
delay_ms(motor->speed);
}
else
{
GPIO_Write(GPIOA, 0);
}
}
void motor_rotate(Motor* motor, MotorDirection direction, int degrees, int speed)
{
motor->direction = direction;
motor->speed = speed;
int steps = (degrees * STEPS_PER_REVOLUTION) / 360;
for(int i = 0; i < steps; i++)
{
motor_step(motor);
}
motor->direction = STOPPED;
}
#### 光敏传感器
void ADC2_Init(void)
{
GPIO_InitTypeDef ADC_GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// 初始化 PA5 用于采集
ADC_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
ADC_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOA, &ADC_GPIO_InitStructure);
// 初始化ADC2
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC2, &ADC_InitStructure);
// ADC2, 通道5
ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC2, ENABLE);
ADC_ResetCalibration(ADC2);
while(ADC_GetResetCalibrationStatus(ADC2));
ADC_StartCalibration(ADC2);
while(ADC_GetCalibrationStatus(ADC2));
ADC_SoftwareStartConvCmd(ADC2, ENABLE);
}
float ADC2_GetValue(void)
{
uint32_t Value = 0;
float ret = 0.0;
for(uint8_t i = 0; i < 30; i++)
{
ADC_SoftwareStartConvCmd(ADC2, ENABLE);
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC));
Value += ADC_GetConversionValue(ADC2);
}
Value /= 30;
ret = 30.303 * (3.3 - Value * (3.3/4095));
return ret;
}
#### 解包
这个是因为阿里云下发数据的格式是JSON格式,我们利用了stm32的jansson库对数据进行解析
int parse_LED_value(char* str)
{
json_error_t error;
json_t *root, *params, *led;
const char *json_start = strstr(str, “{“method”:“thing.service.property.set””);
if (!json_start) {
// 错误处理:找不到JSON的开始
return -1;
}
root = json\_loads(json_start, 0, &error);
if (!root) {
// 错误处理:无法解析JSON
return -2;
}
params = json\_object\_get(root, "params");
if (!params) {
// 错误处理:'params'对象不存在
json\_decref(root);
return -3;
}
led = json\_object\_get(params, "switch");
if (!json\_is\_integer(led)) {
// 错误处理:'LED'不存在,或者其值不是一个整数
json\_decref(root);
return -4;
}
// 获取'LED'的值
int led_value = json\_integer\_value(led);
// 清理解析后的JSON对象
json\_decref(root);
return led_value;
}
### 3.处理数据
我是在main函数中进行数据处理的:
lux = ADC2_GetValue();//光照传感器
if(USART3_RX_STA&0x8000)
{
USART3_RX_BUF[USART3_RX_STA&0x7FFF]=0; //添加结束符
printf(“%s”,USART3_RX_BUF);
if(USART3_RX_STA&0x8000)
{
led_value = parse_LED_value((char*)USART3_RX_BUF);
printf(“LED= %d\r\n”, led_value);
if(led_value == 0)
{
Motor_Flag=0;
LED = 1;
a=0;
}
if(led_value == 1)
{
Motor_Flag=1;
LED = 0;
a=1;
}
}
memset(USART3_RX_BUF,0,sizeof(USART3_RX_BUF)); //清空接收缓冲区
USART3_RX_STA=0; //重置接收状态
}
if(Motor_Flag1 || (int)lux<45)
{if(a1)
{
delay_ms(50);
Motor motor = {STOPPED, 0, 0};
motor_rotate(&motor, FORWARD, 180, 1);
Motor_Flag=2;
a=0;
}
}
else if(Motor_Flag0 || (int)lux >70)
{if(a0)
{
delay_ms(50);
Motor motor = {STOPPED, 0, 0};
motor_rotate(&motor, BACKWARD, 90, 1);
Motor_Flag=2; a=1;
}
}
DHT11_Read_Data(&temp,&humi);//温湿度传感器读取数据
---
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/5cdd1cfdd531ca5547ead418ff1c7be5.png)
![img](https://img-blog.csdnimg.cn/img_convert/25ad6b78f3aa814376249c595c61dba6.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/2a4559579513f7c573d1fed2a1c129ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/99342f8f1c8652a260c52c557e294d48.png)
![img](https://img-blog.csdnimg.cn/img_convert/e33a4c5b05695c64319b9ce5668b046c.png)
![img](https://img-blog.csdnimg.cn/img_convert/445a01b6aeaa922cd67b60ccdf17d36a.png)
![](https://img-blog.csdnimg.cn/img_convert/663926c7031cf60d55dc946be35e9d3e.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
vRsYVA-1715608396968)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!