ESP8266 与Arduino的入门教程

博主也是新手,由于网上资料较少 花了整整快一个月的时间才将所有的逻辑打通 弄清楚

博主所接的项目是使用小机器人与wifi模块去建立RadioMap. 在这里博主不多解释RadioMap 是什么,有好奇的宝宝可以自行谷歌或者百度。 这里只需要知道建立RadioMap需要收集附近WiFi的RSSI以及SSID.

博主这里所选的小机器人是Makeblock 所开发的mBot以及所对应的WiFi 模块, 在仔细查询资料后才知道mBot所用的开发板是Arduino UNO,WiFI模块是以ESP8266为基础开发的模块。由于其积木编程过于局限,所以选择了Arduino IDE。

我们需要配置Arduino IDE 分成两步:导入makeBlock library 以及配置ESP8266的开发环境

配置Arduino IDE 的教程在这里:

https://jingyan.baidu.com/article/8065f87f904f4c2331249881.html(导入Arduino 的外包-makeBlock library)

https://www.cnblogs.com/kekeoutlook/p/8216639.html(配置ESP8266开发环境)

整个ESP8266 的模块与Arduino的逻辑是这样的:ESP8266 是一个单片机, Arduino UNO 是一个单片机,我们需要解决的是ESP8266 与Arduino的通信以及传输问题。 整个步骤如下:

1. 编写ESP8266的代码 并进行烧录

2. 编写Arduino的代码并进行烧录

3. 编写Java 代码 与ESP8266 进行通信

 

第一步:

首先说一下ESP8266 的烧录方式, 你需要买一个USB 转TTL的转换器来连接ESP8266 模块与计算机, 楼主这里选择的是型号为USB转UART串口模块CP2102 usb TTL485互转模块,淘宝上一搜都有,当然你可以选择别的 下面这个是图片。在使用时需要把开关打开。 具体的连线方式你们自己去搜就好 网上有很多。 接下来把代码代码复制到Arduino中 进行烧录 Arduion 也给了许多样例,照着改就好 下面是博主的代码:

 


#include <ESP8266WiFi.h>

const char* ssid     = "ESP8266 需要连接的WIFI的SSID";
const char* password = "Wifi密码";


void setup() {
  Serial.begin(9600);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}

int whetherConnect = 0;
WiFiClient client;
const uint16_t port = 8082;
const char * host = "你的IP"; // ip or dns

void loop() {
    if(client.connected()==true)
         whetherConnect=1;
      else
         whetherConnect=0;    
    if(whetherConnect==0)
    { 
        Serial.print("connecting to ");
        Serial.println(host);
    
        
        if (!client.connect(host, port)) {
            Serial.println("connection failed");
            Serial.println("wait 5 sec...");
            delay(5000);
            return;
        }
        else
        {
          whetherConnect =1;
        }
    }

    if(Serial.available())
    {
       if(Serial.read()=='#')
       {
        int n = WiFi.scanNetworks();
        Serial.println("scan done");
        if(n==0)
        { 
          client.println("no networks found");
          delay(200);
        }  
        else
        {
          client.print(n);
          client.println(" networks found");
          delay(500);
          for (int i = 0; i < n; ++i)
          {
            // Print SSID and RSSI for each network found
            //client.print(i + 1);
            //client.print(": ");
            client.print(WiFi.SSID(i));
            delay(500);
            client.print(" ");
            delay(500);
            client.println(WiFi.RSSI(i));
             delay(500);
           // client.print(")");
            //client.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*"); 
          }
        }
        
        // This will send the request to the server
        client.println("------------------------------------------");
    
        //read back one line from server
        //String line = client.readStringUntil('\r');
        //Serial.println(line);
    
        //Serial.println("closing connection");
        //client.stop();
        
       // Serial.println("wait 5 sec...");
      //  delay(5000);
      }
      
   }
}

 

在烧录成功后 即可拔下(如果出现不成功的情况别慌 把串口拔下来 在插回电脑就行 多插两次 即可)

2. 将代码烧录进Arduino UNO:

这里相信大家都知道便不再多说 直接上代码:


#include <MeMCore.h>
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

MeUltrasonicSensor ultrasonic_3(3);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
double currentTime = 0;
double lastTime = 0;
double getLastTime(){
  return currentTime = millis() / 1000.0 - lastTime;
}
void move(int direction, int speed) {
  int leftSpeed = 0;
  int rightSpeed = 0;
  if(direction == 1) {
    leftSpeed = speed;
    rightSpeed = speed;
  } else if(direction == 2) {
    leftSpeed = -speed;
    rightSpeed = -speed;
  } else if(direction == 3) {
    leftSpeed = -speed;
    rightSpeed = speed;
  } else if(direction == 4) {
    leftSpeed = speed;
    rightSpeed = -speed;
  }
  motor_9.run((9) == M1 ? -(leftSpeed) : (leftSpeed));
  motor_10.run((10) == M1 ? -(rightSpeed) : (rightSpeed));
}
MeBuzzer buzzer;
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
int RxPin[]={12,10,A3,A1};
int TxPin[]={11,9,A2,A0};
SoftwareSerial mySerial(RxPin[4-1],TxPin[4-1]);

void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while(millis() < endTime) _loop();
}

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(5000);
}

void _loop() {
}

int sendOrNot=0;

void loop() {
  if(ultrasonic_3.distanceCm() < 50){
      motor_9.run(0);
      motor_10.run(0);//Stop Running
      if(sendOrNot==0)
      {
        buzzer.tone(262, 0.25 * 1000);
        delay(20);
        mySerial.println("#");
        sendOrNot=1;
      }
      if(getLastTime() > 15){//If timer bigger than 5
          move(3, 50 / 100.0 * 255);
          _delay(1);
          move(3, 0);

      }

  }else{
      sendOrNot=0;
      lastTime = millis() / 1000.0;
      move(1, 50 / 100.0 * 255);

  }

  _loop();
}

你们这的代码肯定不能跟我一样 因为我使用的是mBot 的主板 其中有一些变化 如果用的是Arduino UNO的话 可以自己去看Arduino IDE 给的样例。当然串口那你们需要自己去写, 这块的内容 百度即可 会有很多

 

3. 编写Java程序: 

博主这里使用的是Java Socket 通信 具体过程便不再阐述 上代码:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerCode{
    private static final  int SERVER_PORT = 8082;
    private static File writeName = new File("Radiomap.txt");

    public static void main(String args[])
    {
        try{
            writeName.createNewFile();
            FileWriter writer = new FileWriter(writeName);
            BufferedWriter out = new BufferedWriter(writer);
            System.out.println("Server: Connecting..1111111");
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            InputStream socketInput;
            Socket clientSocket = serverSocket.accept();
            System.out.println("Server:Receiving...");
            while(true){

                try {
                    socketInput=clientSocket.getInputStream();
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(socketInput)
                    );
                    String str = in.readLine();
                    //System.out.println("11111111");
                    System.out.println("Server:Received: '"+str+"'");
                    out.write(str+"\n");
                    out.flush();
                }catch(Exception e){
                    System.out.println("Server:Error");
                    e.printStackTrace();
                }
              /*  finally {
                    clientSocket.close();
                    System.out.println("Server:Close.");
                }*/
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


接下来将Arduino 与ESP8266 连接后 就可以开始用啦! 

在启动小车与java程序后 你会发现 每到一个有障碍物的地方 小车就会停下 收集RSSI与SSID进行传输 在Java端便可以看到了

博主的项目有特殊性 仅供参考哦! 如果有什么不对的地方 请指出。 不喜勿喷!

 

  • 10
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值