手机UDP遥控飞机V1.0

ESP8266:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "dsx_zj";     //网络名称
const char *password = "dsxbs725"; //网络密码

const int pwm_pin0 = 16;  // D0
const int pwm_pin1 = 5;  // D1
const int pwm_pin2 = 4;  // D2
const int pwm_pin3 = 0;  // D3
int speed = 0;

WiFiUDP Udp;
unsigned int udpPort = 8080; // 本地端口号
char incomingPacket[128];         // 接收缓冲区

void setup()
{
  Serial.begin(115200);
  analogWriteFreq(1000);            // 频率设置为1kHz,即周期为1ms
  analogWriteRange(1024);           // 范围设置为0--1024
  analogWrite(pwm_pin0, 0);     //初始值 0
  analogWrite(pwm_pin1, 0);     //初始值 0
  analogWrite(pwm_pin2, 0);     //初始值 0
  analogWrite(pwm_pin3, 0);     //初始值 0
  Serial.println();
  Serial.printf("Connecting to %s ", ssid);
  WiFi.mode(WIFI_STA);
  WiFi.setAutoConnect(false);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected!");

  //以下开启UDP监听并打印输出信息
  Udp.begin(udpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), udpPort);
}

void loop()
{
  int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
  if (packetSize)                     // 有数据可用
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 128); // 读取数据到incomingPacket
    if (len > 0)                             // 如果正确读取
    {
      incomingPacket[len] = 0; //末尾补0结束字符串
      Serial.printf("UDP packet contents: %s\n", incomingPacket);
      String temp = String(incomingPacket);
      if (temp.substring(0,5) == "speed") // 如果收到Turn off
      {
        speed = temp.substring(6,temp.length()).toInt();
        analogWrite(pwm_pin0, speed);
        analogWrite(pwm_pin1, speed);
        analogWrite(pwm_pin2, speed);
        analogWrite(pwm_pin3, speed);
        Udp.write("The Plante Speed is:" + speed); // 回复LED has been turn off
        Udp.endPacket();
      }
    }
  }
}

APP:

Androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.feijiapp10">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Feijiapp10">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

MainActivity.java

package com.example.feijiapp10;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {
    private SeekBar mSeekBar;
    private Button btn;
    private int speed;  //  保存飞机速度
    private String ip;
    private EditText kj_ip;
    private int port;
    private EditText kj_port;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSeekBar=findViewById(R.id.seekBar);
        btn=findViewById(R.id.connect);
        kj_ip = findViewById(R.id.ip);
        kj_port = findViewById(R.id.port);
        //kj_ip.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
        kj_port.setInputType(InputType.TYPE_CLASS_NUMBER);
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override  //当滑块进度改变时,会执行该方法下的代码
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                speed = i;
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread((new Client())).start();
                btn.setText("已连接,滑动滑块改变飞机转速");
                //Toast.makeText(MainActivity.this,"滑动滑块改变飞机速度",Toast.LENGTH_LONG).show();
            }
        });
        //new Thread((new Client())).start();
    }
    public class Client implements Runnable{
        private DatagramPacket packet;
        private DatagramSocket socket;
        public Client(){

        }
        @Override
        public void run() {
            while(true){
                try {
                    ip = kj_ip.getText().toString();
                    port = Integer.parseInt(String.valueOf(kj_port.getText()));
                    InetAddress serverAdder = InetAddress.getByName(ip);
                    socket = new DatagramSocket();
                    String tmp = "speed:" + speed;
                    byte[] buf = tmp.getBytes();
                    packet = new DatagramPacket(buf, buf.length, serverAdder, port);
                    socket.send(packet);
                    socket.close();
                    Thread.sleep(100);
                } catch (SocketException | UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}



activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/ip"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:hint="IP"
        android:text="192.168.0.10" />

    <EditText
        android:id="@+id/port"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:hint="PORT"
        android:text="8080" />

    <Button
        android:id="@+id/connect"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="连接" />

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="154dp"
        android:max="1024"
        android:progress="0" />


</LinearLayout>


猜你喜欢

转载自blog.csdn.net/weixin_42854045/article/details/127910528
今日推荐