资讯详情

技能梳理19@stm32+esp8266+onenet+继电器+土壤湿度

传递温湿度,土壤湿度达到ESP8266,到onenet,用F103RCT6.土壤湿度超标,继电器水泵出水

1、项目简介

在这里插入图片描述

2、实现逻辑

3、应用场景

#自动浇花 #远程检测环境参数

4.梳理核心代码

///单片机代码  /* USER CODE BEGIN 0 */ //temp hump void DHT11_IO_IN(void) { 
             GPIO_InitTypeDef GPIO_InitStructure;     GPIO_InitStructure.Pin = DHT11_Pin;     GPIO_InitStructure.Mode = GPIO_MODE_INPUT;     HAL_GPIO_Init(GPIOA,&GPIO_InitStructure); }  void DHT11_IO_OUT(void) { 
             GPIO_InitTypeDef GPIO_InitStructure;     GPIO_InitStructure.Pin = DHT11_Pin;     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;     HAL_GPIO_Init(GPIOA,&GPIO_InitStructure); }  void DHT11_Rst(void) { 
             DHT11_IO_OUT();  //     DHT11_DQ_OUT_LOW;  //     HAL_Delay(20);     //     DHT11_DQ_OUT_HIGH;  //     delay_us(30);      // }  uint8_t DHT11_Check(void) { 
             uint8_t retry=0;     DHT11_IO_IN();     while (DHT11_DQ_IN amp;& retry<100) { 
        
        retry++;
        delay_us(1);
    };
    if(retry>=100)return 1;
    else retry=0;
    while (!DHT11_DQ_IN&&retry<100) { 
        
        retry++;
        delay_us(1);
    };
    if(retry>=100)return 1;
    return 0;	//???DHT11??0
}

uint8_t DHT11_Read_Bit(void) { 
        
    uint8_t retry=0;
    while(DHT11_DQ_IN&&retry<100) { 
        
        retry++;
        delay_us(1);
    }
    retry=0;
    while(!DHT11_DQ_IN&&retry<100) { 
        
        retry++;
        delay_us(1);
    }
    delay_us(40);
    if(DHT11_DQ_IN)return 1;
    else return 0;
}

uint8_t DHT11_Read_Byte(void) { 
        
    uint8_t i,dat;
    dat=0;
    for (i=0; i<8; i++) { 
        
        dat<<=1;
        dat|=DHT11_Read_Bit();
    }
    return dat;
}

uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi) { 
        
    uint8_t buf[5];
    uint8_t i;
    DHT11_Rst();
    if(DHT11_Check()==0) { 
        
        for(i=0; i<5; i++) { 
        
            buf[i]=DHT11_Read_Byte();
        }
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { 
        
            *humi=(buf[0]<<8) + buf[1];
            *temp=(buf[2]<<8) + buf[3];
        }
    } else return 1;
    return 0;
}

uint8_t DHT11_Init(void) { 
        
    DHT11_Rst();
    return DHT11_Check();
}
/* USER CODE END 0 */

/** * @brief The application entry point. * @retval int */
int main(void)
{ 
        
    /* USER CODE BEGIN 1 */
    tx_onenet[0] = 0xff;
    tx_onenet[1] = 0x74;
    tx_onenet[11] = 0xff;
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART2_UART_Init();
    /* USER CODE BEGIN 2 */
// OLED_Init();
// OLED_Display_On();
// OLED_ShowString(0,0,"TEMP: . C",16);
// OLED_ShowString(0,14,"HUMP: . %",16);
// OLED_ShowString(0,28,"GROUND: ",24);
// OLED_ShowString(43,0,"-",16);
// OLED_ShowString(80,28,"T",24);
// OLED_ShowNum(53,0,12,2,16);
// OLED_ShowNum(77,0,34,2,16);
// OLED_Refresh_Gram();
// HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET);

// while(DHT11_Init()) { 
        
// HAL_Delay(500);
//

    //HAL_ADC_Start_IT(&hadc1);

    //__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//open uart1 RXNE
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    { 
        
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        HAL_GPIO_TogglePin(GPIOA, LED0_Pin);
        HAL_Delay(500);

        //check temp hump
// DHT11_Read_Data(&temperature,&humidity);
// tx_onenet[2] = temperature>>8;
// tx_onenet[3] = temperature&0xff;
// tx_onenet[4] = humidity>>8;
// tx_onenet[5] = humidity&0xff;

        //check YL69
// check_hump = 4092-ADC_num;
// check_hump = (float)(check_hump/3292*100);//ad->hump%
// if((check_hump >= 0) && (check_hump <= 100))
// { 
        
// intH = (int)check_hump;
// float hum_tmp = check_hump - intH;
// hum_tmp *= 100;
// decH = hum_tmp;
// tx_onenet[6] = intH;
// tx_onenet[7] = decH;
// }

// HAL_ADC_Start_IT(&hadc1);

        //TX TO ONENET
// HAL_UART_Transmit(&huart2, (uint8_t *)tx_onenet, 12, 0xFFFF);

        //CTR RELAY
// if(check_hump < 10)//OPEN RELAY
// { 
        
// HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET);
// }
// else //CLOSE RELAY
// HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_SET);

        //OLED DISPLAY

    }
    /* USER CODE END 3 */
}

//lua脚本
TEM = 0
HUM = 0  
GROUND = 0
cnt = 0

--pin=4
--gpio.mode(pin,gpio.OUTPUT)


cfg = { 
        }
cfg.ssid = "oppor11splus"
cfg.pwd = "aptxxxx9"
 
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(cfg)
wifi.sta.connect()
 
 
DeviceId = "xxx38909"
ProductId ="40xxx1"
AuthoTnfo = "k6TYxxxxx4r1f2Cz0aafZUw=fk="--
KeepAlive = 200 
host = "183.230.40.39"
port = 6002 
 
 
myClient = mqtt.Client(DeviceId, KeepAlive, ProductId, AuthoTnfo)
--print("115200 8-n-1")
uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)

        
timer1 = tmr.create()

timer2 = tmr.create()
 
function ReConnect()
    if wifi.sta.getip() == nil then
        print("Connect AP,waitting...")
    else
        print("Connected AP,Success!")
        print("IP is:"..wifi.sta.getip())
        print("MAC address:"..wifi.sta.getmac())
        timer1:stop()
 
        myClient:connect(host, port, function(client)
           -- print("Connected OneNET success!")
           --gpio.write(pin,gpio.LOW) 
        end)
        
       
        uart.on("data", function(data) 
            cnt = string.len(data)
            timer1.stop(1)
            timer1.interval(1, 1)
            timer1.start(1)
            --uart.write(0, data)
            --print("len:",string.len(data))
            ---print(type(data))
            if(cnt == 11) then
                cnt = 0
                if(string.find(data,"t") == 1) then
                    --print("t!") 
                    --print(string.byte(data,2))
                    --print(string.byte(data,3)/100)
                    TEM = string.byte(data,2) + string.byte(data,3)/100
                    HUM = string.byte(data,4) + string.byte(data,5)/100
                    GROUND = string.byte(data,6) + string.byte(data,7)/100
                end
            end
            Update_Message()
        end, 0)
        
        myClient:on("message", function(client , topic , message)
            --print("get a message.\n")
            --print(topic..":"..message)
        print("order:"..message)
        end)
 
        --timer2:alarm(3000, tmr.ALARM_AUTO, Update_Message)
    end
end
 
timer1:alarm(1000,tmr.ALARM_AUTO,ReConnect)


     
function Update_Message()
    info = { 
        }
    info.tem = TEM
    info.hum = HUM
    info.ground = GROUND
 
    --TEM = TEM + 1
    --HUM = HUM - 1
    --GROUND = GROUND + 0.1
	
    ok,message = pcall(cjson.encode, info)
    --print("message:"..message)
 
    header = string.char(3, 0 ,string.len(message))..message
    myClient:publish("$dp", header, 0, 0, function(client)
        --print("Publish info success!")
    end)
end


5、部分参考资料

#lua脚本的资料 #esp8266的固件烧录及脚本运行过程 #原理图见资料包

6、注意事项

#泥土水分传感器是四引脚制的,VCC引脚接3V电源,DO引脚接单片机的PA4引脚,GND引脚接地,AO引脚接单片机的PA6引脚。 #DHT11的VCC引脚接5V电源,GND引脚接地,DOUT引脚先接一个上拉电阻,然后接STM32单片机PA5引脚,NC引脚悬空。 #VCC引脚接5V电源,TXD串行输出端口接单片机的PA3引脚,GND引脚接地,RXD数据接收端接单片机的PA2引脚,RST复位引脚和IO_0引脚悬空。 #VCC引脚接5V电源,IN输入引脚接单片机的PC13引脚,GND引脚接地,公共端(COM)端接5V电源,常闭端(NC)端接微型水泵的红线,微型水泵的黑线接地

完整可运行项目地址

标签: sta继电器ad8851继电器1ap继电器31k6电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台