精华内容
下载资源
问答
  • WIFI小车APP远程控制,无线智能小车之ESP8266例程

    万次阅读 多人点赞 2019-08-17 17:59:45
    WIFI小车无线远程控制,智能小车之ESP8266例程原理讲解小车改装ESP8266 例程代码WIFI配网程序测试安卓app制作 原理讲解 原理简述:利用发布订阅模式,即:利用ESP8266 订阅了一个主题,再利用app inventor 编写的app...

    WIFI小车无线远程控制,智能小车之ESP8266例程

    原理讲解

    原理简述:利用发布订阅模式,即:利用ESP8266 订阅了一个主题,再利用app inventor 编写的app 往这个主题发布消息,由于ESP8266 订阅了这个消息,所以就可以收到app发布得消息,从而执行相应得动作,比如前进\后退\左转\右转。

    小车改装

    如果有小车的话可以进行改装,改装成WIFI小车,如果没有小车的话,可以现行组装。

    STM32改装方案: 建议采用串口通信的方式,ESP8266可以收到手机app发来的控制指令,如果ESP8266收到指令,可通过串口给stm32发送信息,stm32收到指令后,对小车执行相关动作即可。

    arduino uno 改装方案方案一,这个可以采用和stm32一样的原理,利用串口通信,esp8266收到云端指令,通过串口给arduino 发信息,arduino收到串口信息,对小车执行相关动作即可。方案二,更换NodeMCU开发板,把arduino uno 更换为NodeMCU开发板,直接用NodeMCU当作小车的动作控制器,这种方式比较推荐,较为简单,nodeMCU收到云端指令,直接执行小车动作函数即可。NodeMCU编程完全兼容arduino开发,更换的时候,把控制引脚对应好就行。

    树莓派小车改装方案: 写个python脚本,脚本为TCP客户端,通过TCP客户端连接到服务器,当app通过云端发送控制指令时,树莓派就会收到命令,就可以执行相关小车动作即可。

    其他开发板: 参考arduino uno 改装方案即可。

    ESP8266 例程代码

    版本一:微信配网点击 代码下载

    版本二: 不需要配网的程序下载

    代码修改:

    //用户私钥,可在控制台获取,修改为自己的UID
    #define UID  "4d9ec352e0376f2110a0c601a2857225"
    //主题名字,可在控制台新建
    #define TOPIC  "mycar"
    

    巴法创客云控制台 新建一个主题,主题名字随意,例如mycar,本实例用用mycar,使用示例代码时应修改为自己的主题名字,字母或数字或字母加数字组合。UID为用户私钥,在 巴法创客云控制台 注册登陆后可获得。

    小车控制引脚:
    本例程中是四驱小车

    //**************************************************//
    #define DIRA D0
    #define PWMA D1
    #define DIRB D2
    #define PWMB D3
    #define DIRC D5
    #define PWMC D4
    #define DIRD D6
    #define PWMD D7
    
    //**************************************************//
    

    控制函数:

    void forward();
    void back();
    void turnLeft();
    void turnRight();
    void Stop();
    
    void forward(){//小车前进
       Serial.println("forward");
       digitalWrite(DIRA,HIGH);
       digitalWrite(DIRB,HIGH);
       digitalWrite(DIRC,LOW);
       digitalWrite(DIRD,LOW);
       
       analogWrite(PWMA,500);
       analogWrite(PWMB,500);
       analogWrite(PWMC,500);
       analogWrite(PWMD,500);
    }
    
     void back(){//小车后退
       Serial.println("back");
       digitalWrite(DIRA,LOW);
       digitalWrite(DIRB,LOW);
       digitalWrite(DIRC,HIGH);
       digitalWrite(DIRD,HIGH);
       
       analogWrite(PWMA,500);
       analogWrite(PWMB,500);
       analogWrite(PWMC,500);
       analogWrite(PWMD,500);
     }
    

    ESP8266消息检测:

        if((TcpClient_Buff.indexOf("&msg=1") > 0)) {
          forward();
          oldtime = millis();
          t_flag = true;
        }else if((TcpClient_Buff.indexOf("&msg=2") > 0)) {
          back();
          oldtime = millis();
          t_flag = true;
        }else if((TcpClient_Buff.indexOf("&msg=3") > 0)) {
          turnLeft();
          oldtime = millis();
          t_flag = true;
        }else if((TcpClient_Buff.indexOf("&msg=4") > 0)) {
          turnRight();
          oldtime = millis();
          t_flag = true;
        }else if((TcpClient_Buff.indexOf("&msg=0") > 0)) {
          Stop();
        }else if((TcpClient_Buff.indexOf("&msg=on") > 0)) {
          up_flag = true;
        }else if((TcpClient_Buff.indexOf("&msg=off") > 0)) {
          up_flag = false;
        }
    

    程序说明: 如上所示,通过字符串匹配,
    检测到字符串 &msg=1 执行前进动作,
    检测到字符串 &msg=2 执行后退动作,
    检测到字符串 &msg=3 执行左转动作,
    检测到字符串 &msg=4 执行右转动作,
    检测到字符串 &msg=0 执行停止动作,
    检测到字符串 &msg=on 打开一直运动开关,
    检测到字符串 &msg=off 关闭一直运动开关。
    (默认情况下,如果收到前进等指令,小车只会前进1.5s,如果发送on指令后,再收到前进等指令,就会一直前进。off指令是关闭)。
    如果是采用串口通信的同学,当收到相关指令,通过发送串口发送相关指令控制小车即可。

    WIFI配网

    本程序需要给WIFI板配网,首先关注公众号“巴法云”,或扫码
    在这里插入图片描述
    手机需要先连接到WIFI,在“云设备”中点击“WIFI配网”即可,配网成功后设备会重启,稍等几秒即可,只需配网一次即可,如需再次重新配网,需要连续重启5次开发板,每次间隔2s内,开发者也可接串口开输出的调试信息。

    程序测试

    巴法创客云控制台 此主题处(本例程demo中为mycar) 推送消息 1 ,开小车是否正常前进。

    指令定义 前进是推送1,后退是推送2,左转是3,右转是4,停止是0,如需更多动作,可在单片机中自定义即可,简单说就是检测到某个字符串就执行相关动作,这个应该还是很好理解的。例如检测到msg=1,单片机就会认为是前进指令,会执行前进。在本例程中小车不会一直前进,如果收到前进指令,只会前进1.5s,如需一直前进,推送on,即可,关闭一直前进,推送off。

    如果测试程序都正常运行,可以通过生成自己的安卓手机app进行控制。

    安卓app制作

    安卓app 采用App Inventor开发。拖拽编程,大家不用担心不会玩。

    Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程序。而且这款编程软件不一定非要是专业的研发人员,甚至根本不需要掌握任何的程序编制知识。因为这款软件已经事先将软件的代码全部编写完毕,用户只需要根据自己的需求向其中添加服务选项即可。也就是我们所要做的只是写简单的代码拼装程序。

    程序下载

    需要修改为自己的UID和topic主题,需要和单片机里的保持一致,不然单片机会接收不到消息。

    在这里插入图片描述
    具体可参考上篇帖子的第三节(app inventor 开发):帖子 https://blog.csdn.net/bemfa/article/details/98478379

    展开全文
  • 51单片机DHT11温湿度ESP8266WiFi手机APP显示设计

    万次阅读 多人点赞 2019-03-17 12:30:53
    基于51单片机、ESP8266WiFi模块、温湿度DHT11传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。 1、系统方案 DHT11温湿度传感器采集数据传送...

    某宝购买链接:

    https://item.taobao.com/item.htm?ft=t&id=627586234925

     

    温湿度检测设计。基于51单片机、ESP8266WiFi模块、温湿度DHT11传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。

    1、系统方案 

    DHT11温湿度传感器采集数据传送给单片机,单片机将数据处理之后通过ESP8266WiFi模块将数据发送给手机App。WiFi模块有两个作用:一是串口转WiFi,单片机通过串口将数据发送给Wifi模块,对于单片机编程而言,与Wifi模块通信就相当于与串口通信,不必知道WiFi协议;二是WiFi模块当做WiFi 热点AP,手机搜索8266建立的WiFi名称就能与其连接。显然这种方式只是局域网通信,不能进行远程连接,远程连接需要服务器端的支持,现在常采用的方法是通过阿里云、机智云等,远程连接比较复杂,我们以后再研究。

    2、硬件设计

    整个设计电路图如下所示:

    ESP8266WiFi模块我们采用的是ESP-01S模组,安信可公司出品的,注意ESP-01S的电源是3.3V,而单片机电源是5V,所以需要一个5V转3.3V的模块,我们选用的是LM1117T-3.3V这个器件, LM1117这个器件管脚一定不要接错,否则会发热非常严重然后烧毁。我第一次焊接的时候把LM1117管脚焊错了,上电后用手触碰了一下差点把手烫伤,赶紧把电源拔掉。LM1117的接线如下所示:

    ESP8266的接线如下图所示:

    RX:模块串口通信的接收引脚,接到单片机的TX引脚。
    GND:接地
    TX:模块的发射端,接单片机的RX接口。
    CH_PD / EN:接3.3v高电平。
    VCC:接3.3V的高电平。

    DHT11温湿度传感器负责采集环境中的温湿度数据,在单片机软件设计部分会详细的介绍该传感器的使用步骤。

    引脚说明:
    VDD 供电3.3~5.5V DC
    DATA 串行数据,单总线
    NC 空脚
    GND 接地,电源负极

    3.单片机软件设计

    单片机程序主要是两个点,一是读取DHT11传感器的温湿度数据,二是串口通信。DHT11的官方文档写的很规范,有关于读取数据的详细步骤,文档更新也比较及时,最新的更新日期是2017年3月31号,官网的下载地址:http://www.aosong.com/products-21.html

    DHT11采用单总线通信,单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。

    • 传送数据位定义

    DATA 管脚用于DHT11与单片机之间的通讯和同步,采用单总线数据格式,一次传送40 位数据,高位先出。
    数据格式:
    8bit 湿度整数数据+ 8bit 湿度小数数据+ 8bit 温度整数数据+ 8bit 温度小数数据+ 8bit 校验位。
    注:其中湿度小数部分为0。

    • 校验位数据定义

    8bit 湿度整数数据 +  8bit 湿度小数数据 +  8bit 温度整数数据 +  8bit 温度小数数据 = 8bit 校验位
    如果以上等式成立,则本次传感器采集的数据有效,否则无效。

    先看采集数据有效的示例,接收到的40 位数据为:
    0011 0101     0000 0000     0001 1000     0000 0100      0101 0001
    湿度高8 位     湿度低8 位     温度高8 位     温度低8 位    校验位
    计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,接收数据正确。
    湿度:0011 0101(整数)=35H=53%RH 0000 0000(小数)=00H=0.0%RH =>53%RH + 0.0%RH = 53.0%RH
    温度:0001 1000(整数)=18H=24℃ 0000 0100(小数)=04H=0.4℃ =>24℃ + 0.4℃ = 24.4℃

    采集数据无效的示例,接收到的40 位数据为:
    0011 0101     0000 0000     0001 1000    0000 0100     0100 1001
    湿度高8 位    湿度低8 位     温度高8 位    温度低8 位    校验位
    计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 不等于0100 1001,本次接收的数据不正确,放弃,重新接收数据。

    通过以上两个示例可以清楚DHT11数据格式以及数据如何去校验有效性。

    • 数据时序图

    用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出40bit 的数据,并触发一次信采集。信号发送如图所示。这里的主机是指单片机,从机是指DHT11传感器。

    下面这个图表罗列了时序图相关的参考时间,在读取数据的详细步骤中会用到这些数值。

    根据时序图和表中的参考时间,我们可以得出读取传感器数据的步骤。

    step1:单片机输出低电平保持20ms

    step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号

    step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。

    step4:通过while语句等待83us的低电平响应时间结束

    step5:通过while语句等待87us的高电平响应时间结束

    step6:计算温湿度数据

    step7:单片机输出高电平结束一次数据采集的读取

    step8:校验数据

    在时序图中可以看到,数据读取是每次一位进行的,数据0位和数据1位的低电平时间是相同的,即54us。数据0位的高电平时间是24us,而数据1为的高电平时间是71us,通过高电平时间的差异我们就可以判断出是数据0还是数据1。所以单独写了一个函数用来计算数据0位和1位,由于温湿度的整数和小数部分分别是由8位表示的,我们定义该函数得到8位数据之后给出返回值。步骤6对应的函数computeData() 用来完成上述工作。我们对步骤6进行详细的描述:

    step 6.1:等待54us低电平结束

    step 6.2:延时30us判断高电平是否结束,因为数据0位的电平最大时长是27us,如果超过27us之后高电平结束,则为数据0位,否则为数据1位。

    step 6.3:通过while语句等待高电平结束

    step 6.4:通过移位和或与的方式保存一个数据位

    step 6.5:循环6.1到6.4步骤8次,得到一个字节的数据

    //--------------------------------
    //-----湿度读取子程序 ------------
    //--------------------------------
    //----以下变量均为全局变量--------
    //----温度高8位== temperature_H------
    //----温度低8位== temperature_L------
    //----湿度高8位== humidity_H-----
    //----湿度低8位== humidity_L-----
    //----校验 8位 == checkdata-----
    //--------------------------------
    void readData()
    {
        U8  humidity_H_temp,humidity_L_temp,temperature_H_temp,temperature_L_temp,checkdata_temp;
        //step1:单片机输出低电平保持20ms
        P2_0=0;
        delayms(20);
        //step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号
        P2_0=1;
        delay13us();
        //step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。
        if(P2_0==0)
        {
            //step4:通过while语句等待83us的低电平响应时间结束
            while(P2_0==0);	
            //step5:通过while语句等待87us的高电平响应时间结束			
            while(P2_0==1);				
            //step6:计算温湿度数据
            humidity_H_temp = computeData();
            humidity_L_temp = computeData();
            temperature_H_temp = computeData();
            temperature_L_temp = computeData();
            checkdata_temp = computeData();
            //step7:单片机输出高电平结束一次数据采集的读取
            P2_0 = 1;		
            //step8:校验数据
            if(checkdata_temp == humidity_H_temp + humidity_L_temp + temperature_H_temp + temperature_L_temp)
            {
                humidity_H = humidity_H_temp;
                humidity_L = humidity_L_temp;
                temperature_H = temperature_H_temp;
                temperature_L = temperature_L_temp;
                checkdata = checkdata_temp;
            }
        }
    
    }
    
    /**
    *根据时序计算温湿度值
    */
    U8 computeData()
    {
        U8 i,U8comdata;
        for(i=0; i<8; i++)
        {
            //step 6.1:等待54us低电平结束
            while(P2_0==0);
            //step 6.2:延时30us判断高电平是否结束	
            Delay_10us();					
            Delay_10us();
            Delay_10us();
            U8temp=0;
            if(P2_0==1)						
            {											
                U8temp=1;
            }
            //step 6.3:通过while语句等待高电平结束
            while(P2_0==1);
            //step 6.4:通过移位和或与的方式保存一个数据位			
            U8comdata<<=1;
            U8comdata|=U8temp;
        }
        return U8comdata;
    }

    温湿度数据读取完毕,接下来就是通过串口发送出去,串口发送数据的代码相对简单了,我们在主函数中对串口通信进行初始化,然后在一个while语句中每隔2s读取数据然后发送。

    //----------------------------------------------
    //main()功能描述:  STC89C52RC  11.0592MHz   串口发送温湿度数据,波特率 9600
    //----------------------------------------------
    void main()
    {
        U8  i;
        TMOD=0x20;		//定时器1工作在方式2
        TH1 = 0xfd;		//波特率9600
        TL1 = 0xfd;
        SM0=0;				//串口工作在方式1
        SM1=1;
        EA = 1;				//开总中断
        REN = 1;			//使能串口
        TR1 = 1;			//定时器1开始计时
        delayms(1000);
    	sendString("AT+CWMODE=2\r\n");		//ap模式
    	delayms(1000);	
    	sendString("AT+CIPMUX=1\r\n");		//允许多连接
    	delayms(1000);	
    	sendString("AT+CIPSERVER=1\r\n");	//建立TCP Server
    	delayms(1000);
        ES = 1;				//开串口中断
    	
        while(1)
        {
            //调用温湿度读取子程序
            readData();
            str[0]=humidity_H;
            str[1]=humidity_L;
            str[2]=temperature_H;
            str[3]=temperature_L;
            str[4]=checkdata;
            //发送到串口
            delayms(2);					//发送温度数据
            sendString( "AT+CIPSTART=1,\"TCP\",\"192.168.4.2\",5000\r\n");
            delayms(2);
            sendString("AT+CIPSEND=1,5\r\n");
            delayms(2);
            for(i=0; i<5; i++)
            {
                sendOneChar(str[i]);
            }
            //读取模块数据周期不易小于 2S
            delayms(2000);
        }
    }

    至此,单片机端的主要代码就讲解完了,可以看到核心代码是如何读取DHT11的数据。

    4.手机APP软件设计

    APP是用Android Studio(AS)开发的,不建议初学者学习Eclipse结合ADT(Android Eclipse Tools)插件的方式开发Android APP,这种方式已经过时并且以后会被淘汰,Google在2016年底已经停止了对ADT的更新,我之前所在的公司已经将Eclispe的代码全部迁移到AS平台了,推荐使用Google自家的AS集成开发环境。AS有很多优点,但是在使用时也有问题,AS借助gradle进行项目构建,至于为什么Google利用gradle进行Android app项目构建,读者可以自行上网搜索。gradle插件版本要和AS版本相对应,不同的开发者的gradle版本可能不同,所以当你拿到另外一个开发者的代码在自己的AS运行时时有可能会构建失败。这个现象对于国外开发者而言不是一个问题,AS可以自动去下载所需要的gradle插件版本,但是在国内,由于众所周知的原因,如果不会科学上网那么AS直接尝试下载gradle插件时会失败,会令很多初学者不知所措。在以后有时间我会单独写一篇blog来讲解如何去解决这个问题。最近听到Google要重返中国市场,如果能回归成功,对于国内的很多开发者和学术研究者而言是个好消息。

    言归正传,本设计APP的代码主要分成两个部分,一是WiFi数据的接收,二是图表显示。

    在OnCreate()方法中进行控件的初始化,并开启一个温度数据接收线程来接收数据。

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //实例化控件
            mTemperatureTv = findViewById(R.id.tv_temperature);
            mHumidityTv = findViewById(R.id.tv_humidity);
            mTemperatureAlert = findViewById(R.id.tv_temperature_alert);
            mHumidityAlert = findViewById(R.id.tv_humidity_alert);
            mTemperatureRangeTv = findViewById(R.id.tv_temperature_range);
            mHumidityRangeTv = findViewById(R.id.tv_humidity_range);
            mTemperatureRangeTv.setText("(" + mTempLow + " - " + mTempHigh + "℃)");
            mHumidityRangeTv.setText("(" + mHumidityLow + " - " + mHumidityHigh + "%)");
            mLineChart = findViewById(R.id.chart);
            //初始化图表属性
            initChart();
            //开启温度显示线程
            new ReceiveDataThread().start();
        }

    单独开辟一个线程用来循环读取WiFi模块传输过来的数据,对于App而言单片机通过Wifi模块传输的数据相当与网络数据,用网络编程相关的就可以,线程的相关定义如下所示:

    /**
         * 温湿度数据接收线程
         */
        private class ReceiveDataThread extends Thread {
            private DataInputStream in;
            private byte[] receive;
    
            @Override
            public void run() {
                try {
                    //在手机端建立一个ServerSocket,负责接收ESP8266发送的数据,端口为5000
                    serverSocket = new ServerSocket(5000);
                    client = serverSocket.accept();
                    while (true) {
                        //循环读取数据
                        in = new DataInputStream(client.getInputStream());
                        receive = new byte[5];
                        in.read(receive);
                        String data = new String(receive);
                        //刷新UI
                        doUIRrefresh(data);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

     

    展开全文
  • WiFi-ESP8266入门开发(十九)--手机APP控制和透传

    万次阅读 多人点赞 2018-06-08 10:09:00
     通过上一篇我们使用了电脑tcp调试软件来控制继电器,今天我们使用手机来控制继电器,这里同样是使用手机调试软件和ESP8266接入同一个wifi网络即接同一个路由器,手机开热点也可以。这里我们使用的是手机和ESP8266...

     

    注:对于ESP8266开源技术感兴趣的可以加群,我们一起探索交流学习,群号:579932824。群名:ESP8266开源技术交流群。

    1.手机控制

            通过上一篇我们使用了电脑tcp调试软件来控制继电器,今天我们使用手机来控制继电器,这里同样是使用手机调试软件和ESP8266接入同一个wifi网络即接同一个路由器,手机开热点也可以。这里我们使用的是手机和ESP8266连接同一个路由器。

    打开手机上的网络调试助手

     

    点击配置输入端口号8266,点击激活。ps:端口号可以任意取一个,两边对应即可

     

     

    打开arduino ide修改下代码,如下

     

     

    /*这篇把8266作为TCPcleint,加入手机创建的tcpServer中来控制一个继电器*/
    
    #include <ESP8266WiFi.h>
       
    #define relayPin 2               //继电器连接在8266的GPIO2上
    const char *ssid     = "TP_LINK_6960";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
    const char *password = "123456789";//你要连接的wifi密码
    const char *host = "192.168.191.4";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
    WiFiClient client;
    const int tcpPort = 8266;//修改为你建立的Server服务端的端口号
    
    void setup()
    {    
        pinMode(relayPin,OUTPUT);
        Serial.begin(115200);
        delay(10);
        Serial.println();
        Serial.println();
        Serial.print("Connecting to ");//写几句提示
        Serial.println(ssid);
       
        WiFi.begin(ssid, password);
       
        while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
                                             //这里就不一一赘述它返回的数据了,有兴趣的到ESP8266WiFi.cpp中查看
        {
            delay(500);
            Serial.print(".");
        }//如果没有连通向串口发送.....
       
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
    }
       
       
    void loop()
    {
        while (!client.connected())//几个非连接的异常处理
        {
            if (!client.connect(host, tcpPort))
            {
                Serial.println("connection....");
                //client.stop();
                delay(500);
            }
        }
        while (client.available())//available()同ARDUINO,不解释了
        {
            char val = client.read();//read()同arduino
            if(val=='a'){//pc端发送a和b来控制
               digitalWrite(relayPin, LOW);
            }
            if(val=='b')
            {
                digitalWrite(relayPin, HIGH);
            }
        }
    }

    编译烧写固件

     

    给ESP8266上电,打开手机调试软件可以看到已经有一个设备加入网络了
     

    发送我们设定的0和1开关继电器
     

    哈哈,就可以开关继电器啦。
    我也发一个有按钮的调试软件,用法一样
     

    手机设置为服务端,这里我们使用一个指令控制,改下代码就可以了
    先申明一个变量来存状态
    boolean ONorOFF=LOW;
    在改成
    if(val == 1) {
                digitalWrite(2,ONorOFF);
                Serial.print("ON");
                ONorOFF = (!ONorOFF);

    这样就可以一个指令控制了。

    2.透传

     

     

     

           ESP8266叫串口wifi模块,那么透传肯定不能少,把8266作为透传同理就是把8266串口获取到的数据无线发送出去。

    改下上面的代码即可:

        while (client.available())//改动的就这里啦,无线读取到的数据转发到到串口
        {
            uint8_t c = client.read();
            Serial.write(c);
        }
     
     
        if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
        {
            size_t counti = Serial.available();
            uint8_t sbuf[counti];
            Serial.readBytes(sbuf, counti);
            client.write(sbuf, counti);
     
        }

    这样透传就OK啦,把8266的rx,tx接在其他单片机的tx,rx上。

    3.全局广播,无视IP

    直接上源码:(有的ESP8266模块只能定向发送)

    #include <ESP8266WiFi.h>
    #include <WiFiUdp.h>
    
    const char *ssid = "MyWIFI";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
    const char *password = "123123123";//你要连接的wifi密码
    const char *UDPhost = "255.255.255.255";//局域网全网UDP广播地址,也可以使用你本地网段后缀为255也行,不过适应能力就弱了
    WiFiClient client;
    const int udpPort = 4321;//修改为你建立的Server服务端的端口号
    unsigned int localPort = 3888;//UDP端口侦听
    char packetBuffer[255]; //存放接收到的UDP数据
    char  whoamiBuffer[128]="Udp Test01";
    char  ReplyBuffer[255] = "I Received packet!";       // 回复广播发送者
    WiFiUDP Udp;
    
    void setup()
    {
      Serial.begin(115200);
      delay(10);
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");//写几句提示,哈哈
      Serial.println(ssid);
      WiFi.begin(ssid, password);//连接WIFI热点
    
      while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
      {
        delay(500);
        Serial.print(".");//如果没有连通向串口发送.....
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的本机ip地址
      long rssi = WiFi.RSSI();
      Serial.print("signal strength (RSSI):");
      Serial.print(rssi);
      Serial.println(" dBm");//整几个高大上的数字,比如信号强度啥米的,呵呵
    
      // 开始UDP端口侦听
      Udp.begin(localPort);
    
      //先把自己是谁广播出去
      Udp.beginPacket(UDPhost, udpPort);
      Udp.write(whoamiBuffer); 
      Udp.endPacket();
      Serial.println(UDPhost);
    }
    void loop()
    {
    
      //UDP广播数据到达处理
      int packetSize = Udp.parsePacket();
      if (packetSize) {
        Serial.print("Received packet of size ");
        Serial.println(packetSize);
        Serial.print("From ");
        IPAddress remoteIp = Udp.remoteIP();//获取远程广播包发送IP
        Serial.print(remoteIp);
        Serial.print(", port ");
        Serial.println(Udp.remotePort());
    
        // 将到达的数据包读入packetBufffer
        int len = Udp.read(packetBuffer, 255);
        if (len > 0) {
          packetBuffer[len] = 0;
        }
        Serial.println("Contents:");
        Serial.println(packetBuffer);
    
        // 回复信息给广播发送IP
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    //    strcat(ReplyBuffer,Udp.remoteIP());
        Udp.write(Udp.remoteIP());
        Udp.write(ReplyBuffer);
        Udp.endPacket();
      }
    }
    

    展开全文
  • WIFI智能插座设计,APP控制(原理图、PCB、MCU源码、APP源码
  • 之前做了一个andriod通过Wifi控制单片机的app,最近没事传上来,顺便赚点积分 app主要是界面更加友好,界面上有一个触控摇杆,四个拖动条(0-100),四个开关和四个按钮,作为控制,做遥控小车或者其他的手机端控制...
    之前做了一个andriod通过Wifi控制单片机的app,最近没事传上来,顺便赚点积分
    app主要是界面更加友好,界面上有一个触控摇杆,四个拖动条(0-100),四个开关和四个按钮,作为控制,做遥控小车或者其他的手机端控制的小东西都比较方便,硬件基于ESP8266
    单片机端也可以向app端发消息,app会把消息推到textview上
    多的不说,直接上图
    andriod界面





    单片机驱动(范例程序)



    用的之前比赛的一个最小系统,就像这样~


    全览图~

    其他手机的渣像素,还是oppo手机好啊。。。

    链接http://download.csdn.net/detail/csdn1344789841/9627730点击打开链接


    展开全文
  • iOS开发APP内自动链接wifi

    千次阅读 2019-02-20 14:43:36
    公司在做智能硬件方面的业务,有一个自动链接wifi的需求,在网上查了半天,目前因为苹果的限制,只能ios11以上才能用,有点坑,现在整理一下发出来。 首先添加依赖库NetworkExtension.framework   然后打开...
  • 想自己开发一个安卓APP,用于控制手机移动数据和WIFI的开关控制。 比如可以在这个APP中对移动数据的定时,设置开启时间和关闭时间,wifi类似。 问题: 接触安卓不久不太熟悉移动开发,想问问大家这个移动数据和wifi...
  • ,其操作流程和使用方法简单,一种深受广大编程小镇的喜爱今天为大家介绍一种利用它开发手机APP的实战经历 ——手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android...
  • flutter 扫描WiFi并连接的功能 连接到指定的WiFi的SSID import 'package:wifi_configuration/wifi_configuration.dart'; import 'package:wifi/wifi.dart';这两个package怎么使用?
  • 移动app为什么要做版本控制 应用升级无法做到全部升级。比如某应用现行1.1版本,某次开发...很常见的一个场景,比如推送更新的时候,我正在户外,没有wifi,我想等回家了再更新,然而我现在就需要使用这个app。 判断
  • 这个是准备省赛时esp8266,wifi控制app开发,到时候还会用机械臂什么的,这个有需要的话自取吧
  • 智能家居APP开发

    万次阅读 2014-06-09 18:07:44
    智能家具APP开发 欢迎加入APP开发技术群:347072638 前言,随着智能硬件设备的流行,智能家具开始红火,智能家具就是家用电器的智能化,包括智能锁,灯,空调,灯,音箱等等,移动设备通过WIFI或者蓝牙4.0技术...
  • 一张ESP8266WIFI模块(某宝买很便宜) 一根支持数据传输的安卓数据线 一台PC 二.项目所需软件 1.Arduino IDE 开发软件 这里大概说一下windows下的安装, 下载地址 如果你是windows系统选择好对应的操作系统版本,...
  • 一、功能: 1.Android WIFI连接与断开,保存连接IP及端口。 2.WIFI控制3个继电器 3.16进制发送指令,可以单条和多条发送,用逗号隔开。 4.16进制接收 二、源码如下: 登陆Login.java
  • 因为之前都是别人写的APP调试助手,或者别人写的APP(他们写的功能是挺好的),但自己想往深了学习就需要自己动手学习Android,写一个属于自己的APP,这样对以后才有更好的发展。因为Android程序刚开始学习,写的...
  • 根据前两次的ESP8266 学习,在网上找到一款软件可以和WIFI模块进行连接,并且可以根据自己的设计需要进行功能添加,对于初学者的我来说很是舒坦,我经过尝试,是完全可以实现对LED控制的。 我想经过这个APP的使用,...
  • 手机端安装APP,打开WIFI,连接到WIFI模块,打开APP,先连接,然后分别点击"开","关"按钮控制LED灯的亮灭。 理论学习 wif配置 实验准备 arduino主板-1 面包板-1 数据线-1 ESP8266 WIFI模块-1 Led灯-1 220Ω...
  • (远程控制App inventor 编写安卓app控制 ESP8266

    万次阅读 多人点赞 2019-08-05 10:31:51
    App inventor 编写安卓app控制 ESP8266第一 下载ESP8266示例(arduino ide 编程开发)第二 修改demo例程第三 app inventor 开发 原理简述:利用发布订阅模式,即:ESP8266 订阅了一个主题,再利用app inventor 编写...
  • App Inventor插件开发(六)WiFi局域网socket通信

    万次阅读 热门讨论 2018-08-24 12:01:12
    Android下很多人都讲了怎么用socket通信,可是移植到app inventor上的很少。 那就让我来开心的皮一下,介绍一下怎么在局域网内通信,不止WiFi哦。 1.解决步骤 1.1原理 我就不扯tcp/ip了,估计也没人有心思听...
  • 摘要:作为物联网控制APP制作系列文章的最终版,本文带给大家的福利是让大家学会制作完完全全自己可控的安卓APP。与前几篇文章介绍的使用第三方平台自动生成、第三方平台帮助打包、以及android studio制作框架显示...
  • 首先,先打个广告先哈 WiFi-DMX512-A WiFi转DMX512模块 支持手机App控制 这次选择的MCU具有具有3路串口,这样的话最多可支持3路DMX。 先从最简单的做起,就做一路的DMX输出。 这次设计的模块从功能上来说,比之前的...
  • 基于WiFi的智能门锁APP设计

    千次阅读 2019-10-21 10:04:42
    本设计智能门锁APP选择在Android studio平台上开发。该系统通过手机智能门铃APP实现对门外摄像头影像的实时调取、门铃信息的实时查收、实时控制门锁门销的开关。该系统的硬件部分由门锁门销控制模块、WIFI连接模块、...
  • 这次做的东西呢,其实就是个App,这个App用来控制电灯的开关和窗帘的升降。当然这里不仅有软件还有硬件的部分。哦哦,说明一下,我是搞自动化的,以前从来没学过C#,只学过C,所以这个App现在也只是实现了基本的...
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...
  • 用个小程序来测试一下wifi功能,话不多说,直接开搞! 1.环境配置 2.代码编写 直接将下列代码复制到你的arduino程序中 /* 这个示意图演示了如何设置一个简单的类似http的服务器。 *服务器将根据请求设置GPIO pin *...
  • ESP8266 WIFI模块,实现远程控制,带两路继电器,上传传感器信息是当前控制信息,只需要最小模块能运行,程序就能运行,很方便。 不需要额外的单片机用AT模式,此方法最具性价比,开发简单 ESP8266 Fuhome.ino: ...
  • 本文主要介绍开发一个基于单片机的wifi通信远程灯控制的方法,单片机只需支持UART通信即可,以实现最简单的远程控制开关、远程控制亮度,配网后,只需手机联网就可控制联网设备; 本文的wifi模块是基于涂鸦智能的...
  • 系统的功能分析及体系结构设计 (末尾附文件) 系统功能分析 本系统采用STC89C52单片机+LCD1602液晶+...4、通过WIFI模块将心率和温度上传到手机APP。 系统具体框图: 原理图: Pulsesensor脉搏心率传感器模块电路设计
  • 2.Android设备先USB连接电脑,处于开发可调式模式; 3.菜单栏->tools->找到adb wifi 重启下adb 连接、使用 4.Android设备,连接与电脑同一网段的 局域网,并记下IP地址 如192.168.1.8 5.打开Android Studio...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,081
精华内容 7,632
关键字:

wifi控制app的开发