android客戶端控制樹莓派GPIO點亮LED燈

  首先需要android客戶端與樹莓派進行連接,樹莓派與android客戶端利用wifi連接並進行socket通信請參考我的另一片文章:https://mp.csdn.net/postedit/79911322 。樹莓派與Android客戶端連接成功後就可以開始讓android客戶端給樹莓派發送指令控制樹莓派GPIO口的電平輸出

    首先需要搞清楚樹莓派的GPIO引腳,這裏我用的樹莓派3B,其引腳圖參數如下:

    上圖中左右依次對應,而我這裏利用的是23、24(GPIO.4、GPIO.5)兩個引腳分別來點亮2個LED燈。

    先貼上跑在樹莓派上的python代碼(代碼很簡單我就不寫註釋了,有問題可以留言):

import socket
import time
import sys
import RPi.GPIO as GPIO
import time

GPIO_PIN = 23

HOST_IP = "192.168.12.1"
HOST_PORT = 7654

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)    #用到的引腳必須要先setup
GPIO.setup(24, GPIO.OUT)

print("Starting socket: TCP...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)
socket_tcp.bind(host_addr)
socket_tcp.listen(1)	

while True:
	print ('waiting for connection...')
	socket_con, (client_ip, client_port) = socket_tcp.accept()
	print("Connection accepted from %s." %client_ip)

	socket_con.send("Welcome to RPi TCP server!")

	while True:
		data=socket_con.recv(1024)
		if data:
			print(data)	
			while True:
				ctlmsg=socket_con.recv(1024)
				if ctlmsg=="device1":
					GPIO_PIN=23
				if ctlmsg=="device2":
					GPIO_PIN=24	
				if ctlmsg=="turn_on":
					print("************turn on********")
					GPIO.output(GPIO_PIN,GPIO.HIGH)
				if ctlmsg=="turn_off":
					print("************turn off********")
					GPIO.output(GPIO_PIN,GPIO.LOW)
				if ctlmsg=="exit":
					print("*************exit from device_control************")
					break
				
socket_tcp.close()

    接下來是android客戶端的實現,先看xml佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="woyou.wifidemo.ui.activity.Device_Control_Activity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="2"
            android:text="設備選擇:"
            android:textSize="20dp"/>
        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_weight="8"
            android:id="@+id/sp_dev_select"/>
    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp" />
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:id="@+id/bt_dev1_on"
            android:text="開啓"/>
        <TextView
            android:layout_width="20dp"
            android:layout_height="wrap_content" />
        <Button
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:id="@+id/bt_dev1_off"
            android:text="關閉"/>
    </LinearLayout>

</LinearLayout>

    接下來是功能實現:

package woyou.wifidemo.ui.activity;

import android.support.annotation.NonNull;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import woyou.wifidemo.R;
import woyou.wifidemo.utils.Socket_Utils;


public class Device_Control_Activity extends ActionBarActivity {

    Button bt_dev1_on;
    Button bt_dev1_off;
    Spinner spinner;
    private String[] dev = {"設備一","設備二"};
    private List<String> dev_list = null;
    private ArrayAdapter adapter = null;

    String device_select = "設備一";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setTitle("設備控制");
        setContentView(R.layout.activity_device__control_);
        initView();
        initSpiner();
        onlistener();
    }

    private void initSpiner() {
        for (int i=0 ; i < dev.length ; i++)
            dev_list.add(dev[i]);
        adapter = new ArrayAdapter(this , android.R.layout.simple_list_item_1 , dev_list);
        adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);//爲adapter分配樣式:單選
        spinner.setAdapter(adapter);
    }


    private void onlistener() {
        bt_dev1_on.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Socket_Utils.send(Socket_Utils.socket , "turn_on");    //給樹莓派發送turn_on
            }
        });
        bt_dev1_off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Socket_Utils.send(Socket_Utils.socket , "turn_off");    //給樹莓派發送turn_off
            }
        });

        //下拉框的設備選擇監聽
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                ArrayAdapter<String> adapter = (ArrayAdapter<String>) parent.getAdapter();
                device_select = (String) adapter.getItem(position);
                if (device_select.equals("設備一"))
                    Socket_Utils.send(Socket_Utils.socket , "device1");    //給樹莓派發送device1
                if (device_select.equals("設備二"))
                    Socket_Utils.send(Socket_Utils.socket , "device2");    //給樹莓派發送device2

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });


    }

    private void initView() {
        bt_dev1_off = (Button) findViewById(R.id.bt_dev1_off);
        bt_dev1_on = (Button) findViewById(R.id.bt_dev1_on);
        spinner = (Spinner) findViewById(R.id.sp_dev_select);
        dev_list = new ArrayList<String>();
    }
}

    主要實現了一個下拉選擇框選擇設備(LED燈),然後給樹莓派發送相關指令控制樹莓派的GPIO口進而控制小燈泡亮滅

    看一下效果:

由於我的項目中需要用到繼電器來控制設備,所有我加了個繼電器,大家完全可以去掉繼電器,我的接線圖如下:    



設備1開(LED1亮),由於太亮,我用手指擋住了,效果好點


切換設備



設備2開(LED2亮)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章