android客户端控制树莓派GPIO点亮LED灯

原创 2018年04月16日 17:50:50

  首先需要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亮)



树莓派入门二之GPIO控制LED灯

树莓派的GPIO接口图 要点亮一个LED等,我们需要用到两个接口:GPIO 17 和 Ground GPIO 17 :位于11的位置,可以用程序控制其电平的高低 Ground: 顾名思义,接地 ...
  • bottlerun
  • bottlerun
  • 2015年05月13日 15:44
  • 1205

裸机程序二:GPIO点亮led灯 c语言

开发板:  JZ2440 V3 + EasyOpenJTAG 参考资料:《CPU三星S3C2440A芯片手册.pdf》                    《第2课 GPIO实验.avi》 ...
  • heyuqian_csdn
  • heyuqian_csdn
  • 2016年11月01日 23:55
  • 336

树莓派简单led灯实验

树莓派简单led灯实验首先附上gpio引脚图: 布局为: 从gpio25引出一条线到面包板(右边第11个口,从1开始数起),从gnd引一条线到面包板(右边第3个口),连接一个led灯。 如图: ...
  • brightming
  • brightming
  • 2016年01月10日 00:11
  • 713

树莓派通过Flask网页端控制LED小灯

原文链接:http://www.cnblogs.com/ttssrs/p/4890635.html 原作者:ttssrs 1.概述   在局域网内,基于flask搭建web服务,从而可以使...
  • guyang1995
  • guyang1995
  • 2017年02月16日 13:04
  • 2470

在树莓派上用python控制LED

初步学习RPi.GPIO模块的过程中写了一个控制8个LED的模块,基本上只是一个对RPi.GPIO的一个封装 所需材料 一个已经安装配置好了的树莓派连接控制树莓派所用的其他必须设备200Ω电阻...
  • CuGBabyBeaR
  • CuGBabyBeaR
  • 2014年04月07日 21:53
  • 6589

树莓派GPIO控制RGB彩色LED灯

树莓派GPIO通过PWM来控制RGB彩色LED灯,可以显示任何我们想要的颜色。 RGB模块简介 这个RGB彩色LED里其实有3个灯,分别是红灯、绿灯和蓝灯。控制这三个灯分别发出不同...
  • coolwriter
  • coolwriter
  • 2017年08月30日 17:17
  • 325

远程控制通讯——基于树莓派 Python gpiozero 远程控制LED灯并返回控制结果

一、目的 通过树莓派连接贝壳物联服务器(Python gpiozero 、socket),在手机app、微信、网页端发送指令控制LED灯并返回控制结果。 二、硬件 树莓派(系统raspb...
  • NCTU_to_prove_safety
  • NCTU_to_prove_safety
  • 2017年03月23日 17:36
  • 820

STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)

控制GPIO输出点亮LED灯——直接操作存储器 一.预备知识 使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写“1”或者写“0”即可。但使用STM32控制IO...
  • SahPah
  • SahPah
  • 2014年08月13日 12:04
  • 5270

树莓派3b连接LED实现呼吸灯效果(C语言版)

实现呼吸灯效果: 树莓派引脚输出的电平只有0和1,但要实现渐变的效果,传入的电流必须有0.x的值,为了达到这个目的,首先要引入脉冲宽度调制(PWM)的概念,LED的点亮和熄灭,是电平高低变换的结果,可...
  • qq_32384313
  • qq_32384313
  • 2017年09月07日 14:47
  • 498

树莓派学习二(点亮LED灯)

为什么我拿着树莓派没去学编程?兴趣问题吧,要编程我在就电脑上敲代码了,而且我也只会C语言,C++还在学所以做不出什么项目出来,就觉得没意思。闲来无聊树莓派就是很好的发泄对象,要用树莓派点亮一个小小的L...
  • qq_38005186
  • qq_38005186
  • 2017年06月11日 23:22
  • 364
收藏助手
不良信息举报
您举报文章:android客户端控制树莓派GPIO点亮LED灯
举报原因:
原因补充:

(最多只允许输入30个字)