【嵌入式-4】学习笔记

前言
这学期开了一门《嵌入式应用系统开发》的课程,本身学软件,对硬件方面也不是特别精通,整理一下我自己学习过程中的想法和笔记分享出来仅供参考。在写这篇博客的时候,我的同学找到了我之前的那几篇,这几篇博客算是期末的实训报告,但是发表在这里也算是对课程的总结,之后深入学习有改进的地方还可以回来找得到,并且博客本来也就是写来分享的。但是考虑到作业的问题,我打算在交完作业以后再发布这一篇。

0 实验目的
[单片机作客户端开发应用系统]通因为大多数情况下,单片机系统都是处在内网之中,不方便在外网直接访问,所以远程的和单片机的通信经常通过服务器来实现,单片机把采集到的数据以get或者post的方式发送给指定服务器,服务器的返回信息也可以作为单片机的控制指令。这样我们就可以通过手机客户端或者直接在服务器提供的网页上查看单片机传出的信息以及给单片机下指令:要求
1.单片机采集数据(类似于Arduino串口正弦波发生器那种,频率低一些)通过参数传递给服务器
示例:esp8266wifi - wificlient 发出get请求,并显示服务器的返回信息
2.用自己擅长的服务器开发简单页面。能够读取单片机发出的参数,可以保存在文本文件中(数据库当然更好,看个人精力不具体要求)能够在浏览器上打开网页查看这些传送来的数据,建议用图形显示,参考实例目录 ESP8266WebServer中的AdvancedWebServer里面用到的SVG格式画图工具。如果要分不同设备(比如是多个单片机采集的数据),需要在传参的时候加上本设备的标识,显示的时候也要分设备显示信息,当然这也根据精力和兴趣,不做强制要求。
3.设计一个网页上面提供一个按钮开关,在网页上设置开关状态,单片机定期访问服务器,根据这个状态开关灯(简单起见也可以在串口指示器上输出开关指令)示例 http://192.168.0.25/kg.php 设置开关状态,用浏览器访问 模拟远程操作, 单片机访问 http://192.168.0.25/mingling.php,返回的信息为 on 或者 off 根据这个信息开关灯。

1 实验前的准备
在实验3中,我们利用单片机做服务器,可以上传数据,根据返回本机的IP地址,访问我们编写的页面,实现控制小灯泡的亮与灭。这次实验利用单片机做客户端,优点不能直接被访问到,比较安全。单片机和服务器之间的数据传输量相对其他方式较小,缺点是需要自己编写服务器程序,而且需要自己控制SOCKET的Packet等一系列网络异常情况的处理。通俗的来说,单片机做服务器就好比你上网,所有的而操作、IP地址等你的所有信息都暴露在外,但是单片机做客户端,就像我们通过电脑连接WiFi路由上网,由于某个区域使用网的人很多,无法做到每个人都分配一个IP地址,WiFi路由的IP是由运营商动态分配的,谁需要谁用,我们没有固定的IP,藏在路由背后,就算有不法分子也很难找到你的地址对电脑进行破坏,所以目前来说,基本上我们上网是很安全的。
所要用的的工具如下:
 Arduino
 单片机(我们用的是WIFI开发板 D1 WiFi UNO R3开发板基于ESP8266 ESP-12F 直用IDE)
如下图:

2 连接上单片机
桌面电脑图标,属性找到设备管理器,找到端口

查看是否成功连接上单片机,以及是否安装上ch340驱动(端口会有CH340显示)

打开arduino后注意首先修改工具里这两处:

接下来就可以写代码了
3 arduino代码部分
1、单片机采集数据,通过单片机程序,以参数的形式传递给服务器,并在服务器端设计简单的页面,读取单片机发来的参数,以图形的方式进行展示。
 找到单片机内的示例程序中ESP8266WiFi->WiFiClient,根据信息作相应修改,示例程序如下:
/* This sketch sends data via HTTP GET requests to data.sparkfun.com service.
*You need to get streamId and privateKey at data.sparkfun.com and paste them

  • below. Or just customize this script to talk to other HTTP servers.
    /
    #include <ESP8266WiFi.h>
    const char
    ssid = “316-360”;
    const char* password = “31666666”;
    const char* host = “192.168.0.6”;
    void setup() {
    Serial.begin(115200);
    delay(10);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.println();
    Serial.print(“Connecting to “);
    Serial.println(ssid);
    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 value = 0,grad=0,x;
    void loop() {
    delay(1000);
    ++value;
    Serial.print("connecting to ");
    Serial.println(host);
    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 8080;
    if (!client.connect(host, httpPort)) {
    Serial.println(“connection failed”);
    return;
    }
    x=(sin(grad/180.03.1415) +2)/2100; //利用三角函数生成一个数
    grad=grad+5;
    // We now create a URI for the request
    String url = “/datarecv.jsp?data=”;
    url += x;
    Serial.print("Requesting URL: ");
    Serial.println(url);
    // This will send the request to the server
    client.print(String("GET “) + url + " HTTP/1.1\r\n” +
    "Host: " + host + “\r\n” +
    “Connection: close\r\n\r\n”);
    delay(10);
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
    String line = client.readStringUntil(’\r’);
    Serial.print(line);
    }
    Serial.println();
    Serial.println(“closing connection”);
    delay(1000);
    }
     主要修改部分就是WiFi的名称和密码,服务器的地址以及端口号:

 我们是通过一个三角函数确定许多点来在屏幕相应位置画出图像:

 还有的就是修改get请求的url内容,就是运行程序后我们可访问的地址:

 程序收集数据,并将其作为参数传给服务器,其中url字符串中的datarecv.jsp是服务器端用于数据收集的文件,data为datarecv文件中规定的获取数据的位置,手机连接到同一WiFi下时打开网址,接收到的数据都在屏幕上显示

2、服务器端接收数据和展示数据文件的编写(这一部分没有在自己的电脑上运行出来,讲的可能也不是很详细,下面放上老师上课演示的截图)
 这是服务器端操作的代码,在这可查看到接收数据文件的代码:

 文件中,先声明一个string类型变量v,用于获取url中data参数的值->其次声明一个数组list,并对其进行初始化,通过if判断语句确保其长度保持在160,每次多出一个删除数组第一个值,其余值前移->最后for循环输出已接收到的数据。
 其次数据图形化显示文件有效内容如下,内容可以参考esp8266WebServer – AdvancedWebServer中的绘图部分代码,文件内容是通过创建一个800*200的svg图形,让后通过数组list和for循环用已收到的数据作为坐标点绘制曲线图:

 用手机或者笔记本电脑连接与服务器相同的wifi,访问192.168.0.10:8080/show.jsp即可查看到接收到的数据绘制的曲线图,运行单片机程序即可向服务器发送数据,并在每次发送数据成功之后可以查看到部分已接收数据作为返回值,结果图如下:

原本服务器运行的是三角函数的图像曲线,当我们利用单片机做客户端向服务器发送数据时,打乱了服务器原本显示的平滑曲线。

后来服务器接受到客户端发送的数据后,图像曲线变为有波折的图形。

3、设计一个网页上面提供两个个按钮开关,在网页上设置开关状态,把改变的状态发送到服务器,单片机访问服务器,根据这个状态开关灯示例 http://192.168.0.25/kg.php 设置开关状态,用浏览器访问模拟远程操作,单片机访问 http://192.168.0.25/mingling.php,返回的信息为 on 或者 off 根据这个信息开关灯。
示例程序如下:
/* This sketch sends data via HTTP GET requests to data.sparkfun.com service.

  • You need to get streamId and privateKey at data.sparkfun.com and paste them
  • below. Or just customize this script to talk to other HTTP servers.
    /
    #include <ESP8266WiFi.h>
    const char
    ssid = “316-360”;
    const char* password = “31666666”;
    const char* host = “192.168.0.23”;
    const char* streamId = “69”;
    const char* privateKey = “Asjoker-Team2”;
    void setup() {
    Serial.begin(115200);
    delay(10);
    pinMode(D5, OUTPUT);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.println();
    Serial.print(“Connecting to “);
    Serial.println(ssid);
    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 value = 0;
    //String ip = WiFi.localIP();
    void loop() {
    delay(5000);
    ++value;
    char ch1[10],ch2[10];
    Serial.print("connecting to ");
    Serial.println(host);
    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
    Serial.println(“connection failed”);
    return;
    }
    // We now create a URI for the request
    String url = “http://192.168.0.25/mingling.php”;
    Serial.print("Requesting URL: ");
    Serial.println(url);
    // This will send the request to the server
    client.print(String("GET “) + url + " HTTP/1.1\r\n” +
    "Host: " + host + “\r\n” +
    “Connection: close\r\n\r\n”);
    delay(10);
    String line;
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
    line = client.readStringUntil(’\r’);
    Serial.print(line);
    }
    if (line.indexOf(“on”) != -1)
    {
    digitalWrite(D5, HIGH); // 点亮LED
    }
    else if (line.indexOf(“off”) != -1)
    {
    digitalWrite(D5, LOW);
    }
    Serial.println();
    Serial.println();
    Serial.println();
    Serial.println(“closing connection”);
    }
    实现本功能此处用到两个文件分别命名为kg.php和mingling.php,其中kg.php用于显示开关按钮,mingling.php文件用于记录和显示当前的状态,每次点击按钮导致开关状态变化都会反映在mingling.php文件中,以on和off的形式记录和显示,单片机的程序直接使用get请求,去访问mingling.php即可,同样单片机程序使用示例列表esp8266wifi – wificlient的程序简单修改即可,wifi设置和服务器地址同上,拼串修改如下:

最后,再加入if判断语句,根据从mingling.php获取的内容是on或off对单片机连接的灯泡进行状态修改。

4 总结
这次实验尝试了使用单片机做客户端,通过get请求的方式,将参数发给服务器或从服务器获取相应信息。同时,服务器返回的信息也可以用作单片机的控制指令,实现单片机连接的灯泡状态控制等具体的功能。这样,我们就可以通过手机客户端或服务器的网页对单片机下达指令。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值