` 本次实验参照上次的综合实验, 测试钛极小龟的各项功能, 包括: 多线程,TCP通讯(Server),WiFi连接,各传感器读数等, 并通过Socket通讯在Android APP上实时显示.
与上次实验相同, 将钛极小龟开发板作为Socket Server使用, 手机APP作为Client进行轮询并实时显示数据.
为避免钛极小龟自动获取的IP发生变化导致客户端频繁更改IP, 启用其AP功能并设置固定的AP地址, 通过手机直连开发板的AP热点进行通讯. 这样做的好处是可以使用Server端IP地址固定.
实验工具:
钛极小龟开发板
安卓手机一部
实验步骤:
1.设置AP参数
如图, 设置开发板的AP参数, 包括网络名称,密码,IP地址等
2.烧写程序,安装APP
开发板程序与上次实验相同, 采用多线程, 使用三个线程: Socket监听线程, Socket发送线程, 传感器测量线程. 相互配合又互不干扰, 实现将最新的测量参数发送回客户端.
APP端程序采用线程作为SocketClient轮询开发板, 定时获取相关参数并实时显示.
3.启动APP
连接IP为开发板的AP固定地址, 端口为8080. 未连接开发板时无数据显示.
4.参数显示
点击APP监听按钮,可实时看到参数数据.
4.1 初始状态
初始时,显示当前的温湿度,光照,声响,按键,触摸,红外的状态
4.2 遮盖BH1750
遮盖光照传感器后, 可看到光照度由25下降至5流明
4.3 放开BH1750
停止遮盖光照传感器后, 可看到光照度恢复至160流明
4.4 按下按键
按下开发板按钮, 可看到按键状态从0变为1
5.LCD显示
LCD实时显示环境温湿度,光照度,声响参数
关键代码(开发板):
- try {
- tiWiFi obj = TiWiFi.getInstance();
- System.out.println("SSID: " + obj.getSSID());
- obj.startup(30);
- System.out.println("Wi-Fi Connect. IP: " + obj.getAddress());
- obj.startupSoftAP(false);
- System.out.println("Start SoftAP. IP: " + obj.getSoftAPAddress());
- } catch (IOException ex) {
- System.out.println("Wi-Fi Connect Failed.");
- ex.printStackTrace();
- return;
- }
- try {
- // GPIO资源分配,GPIO0的PIN2/3/4/5脚
- TiGPIO gpio0 = TiGPIO.open(0, 2, 3, 4, 5);
- // I2C主机总线资源分配,I2CM0
- TiI2CMaster i2cm0 = TiI2CMaster.open(0);
- // ADC资源分配,ADC0的CH0通道
- TiADC adc0 = TiADC.open(0, 0);
- /* ---资源绑定--- */
- // I2C主机总线资源PORT0与屏幕对象绑定,屏幕地址:0x3C
- TiOLED_UG2864 oled = new TiOLED_UG2864(i2cm0, 0x3c);
- // I2C主机总线资源PORT0与照度计BH1750对象绑定,默认地址:0x23
- TiBH1750 bh1750 = new TiBH1750(i2cm0);
- // GPIO总线资源PIN2与继电器对象绑定
- TiRelay1CH relay = new TiRelay1CH(gpio0, 2);
- // GPIO总线资源PIN3与温湿度传感器DHT11绑定
- TiDHT dht11 = new TiDHT(gpio0, 3);
- // GPIO总线资源PIN4与触摸按钮对象绑定,触发电平:高电平
- TiButton touch = new TiButton(gpio0, 4, true);
- // GPIO总线资源PIN5与红外解码对象绑定
- TiVS1838BNEC vs1838b = new TiVS1838BNEC(gpio0, 5);
- // 获取键盘实例并设置键盘事件监听对象
- TiKeyboard keyboard = TiKeyboard.getInstance();
- keyboard.setEventListener(new KeyboardListener());
- // 设置ADC参考电压及分压倍数
- adc0.setRefVoltageValue(1.0, 2);
- /* ---资源使用--- */
- // 屏幕开启并清屏
- oled.turnOn();
- oled.clear();
- oled.print(0, 0, "Socket Test!");
-
- touch.setEventListener(new TouchListener(relay));
- vs1838b.setEventListener(new IRDecodeListener());
- Thread.sleep(2000);
-
- //启动传感器测量线程
- SensorComm sensorThread = new SensorComm(bh1750, dht11, oled, adc0, touch, keyboard, vs1838b);
- sensorThread.start();
- //启动TCP通讯线程
- ServerComm td = new ServerComm();
- td.start();
- } catch (Exception ex) {
- ex.printStackTrace();
- } finally {
- try {
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
复制代码
关键代码(安卓):
- String ip = txtIP.getText().toString(), msg = txtMsg.getText().toString();
- int port = Integer.parseInt(txtPort.getText().toString());
- while(true) {
- // 与服务端建立连接
- Socket socket = new Socket(ip, port);
- // 建立连接后获得输出流
- OutputStream outputStream = socket.getOutputStream();
- PrintWriter pw = new PrintWriter(outputStream);//将输出流包装成打印流
- pw.write(msg);
- pw.flush();
- InputStream inputStream = socket.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
- String info = null;
- while ((info = br.readLine()) != null) {
- String[] arys = info.split(";");
- if(arys.length >= 7) {
- Looper.prepare();
- //Toast.makeText(this, "Rcv Data: " + info, Toast.LENGTH_SHORT).show();
- rtValue1.setText("温度: " + arys[0] + " ℃");
- rtValue2.setText("湿度: " + arys[1] + " %");
- rtValue3.setText("光照: " + arys[2] + " 流明");
- rtValue4.setText("声响: " + arys[3]);
- rtValue5.setText("触摸: " + arys[4]);
- rtValue6.setText("按键: " + arys[5]);
- rtValue7.setText("红外: " + arys[6]);
- Looper.loop();
- }
- }
- br.close();
- socket.shutdownOutput();
- inputStream.close();
- pw.close();
- outputStream.close();
- socket.close();
- }
复制代码
`
|