wing 发表于 2018-4-18 13:47:14

新款到货的OCROBOT ALPHA开发板 :ESP8285 + ADS1015 (内含4路ADC 读取程序实例!)

本帖最后由 wing 于 2018-4-27 22:28 编辑

重要的事情要写在最前面:ADC程序在10楼


先上个图,介绍和体验楼下再补~~~~:lol :lol :lol :lol :lol





嗯嗯,大神很快就看到重点了:lol

那么先来分享下更多图

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180419/IMG_0965.JPG

除了8285之外还有锂电

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180419/IMG_0966.JPG

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180419/IMG_0967.JPG

是的8285的ADC并没有标出来

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180419/IMG_0968.JPG


https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180419/IMG_0969.JPG

下面会逐步开始试用了

wing 发表于 2018-4-18 13:47:55

本帖最后由 wing 于 2018-4-21 21:38 编辑

下面来看看开发环境配置,开发板管理安装OCROBOT ESP8266 0.1.2版本

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180420/OCIDE012_01.png

选择开发板为OCROBOT ESP8285

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180420/OCIDE012_02.png


首先来试试RSSI程序,代码如下

//ESP8285获取WIFI信号强度
#include "ESP8266WiFi.h"

void setup() {
Serial.begin(115200);

// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);

Serial.println("Setup done");
}

void loop() {
Serial.println("scan start");

// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
    Serial.println("no networks found");
else
{
    Serial.print(n);
    Serial.println("OCIDE012 networks found");
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i)); //信号强度
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
      delay(10);
    }
}
Serial.println("");

// Wait a bit before scanning again
delay(30000);
}



本程序的实现的功能是扫描周围的WIFI信号,并且通过串口输出各个WIFI的信号数值。运行结果:
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180420/OCIDE012_03.png




弘毅 发表于 2018-4-18 20:20:11

。。。。。我居然忘了画丝印。。。

wing 发表于 2018-4-21 21:43:30


在OC自家的IDE环境下开发过程顺畅,不过在官方版本的Arduino IDE就不那么顺利了,本次测试所用的版本是1.6.12

开发板型号如下

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180420/arduinoIDE01612_01.png

和二楼相同的程序,就无法通过了

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180420/arduinoIDE01612_02.png

之后会再测测其他版本看看哪个能适配

PS:图片均为一比一截屏,点击可以放大

弘毅 发表于 2018-4-22 11:04:13

:loveliness:吓屎了。。。看了下新图纸。。。ADC丝印加了。

wing 发表于 2018-4-22 20:05:01

本帖最后由 wing 于 2018-4-22 20:07 编辑

其实我个人来说找找ADC编号是一个好玩的小游戏,所以我完全不在乎那个印。
当然就产品来说总是要不断完善的。

那么继续来做下一个实验,这次是AP+网页服务,主页面以SPIFFS文件保存,8285内置1M闪存,设置为1M(512K SPIFFS)

程序代码如下

//8266 AP +wswifi ssid=ESP8285xxxxxxxx pwd=ap20180422 访问 http://192.168.128.1/h5c_001.html 可见网页
//页面使用SPIFFS文件保存


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>      //文件系统库SPIFFS

ESP8266WebServer server ( 80 );

//OCIDE 0.1.2 似乎并不会超前定义函数 所以请留意函数的顺序

void handleNotFound() {//404页面
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";

for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
}

server.send ( 404, "text/plain", message );// 返回信息给浏览器(状态码,Content-type, 内容)
}


void ch_page() {//主页面
if(SPIFFS.exists("/h5c_001.html")){//如果文件存在
    File file = SPIFFS.open("/h5c_001.html", "r");            //打开文件
    size_t sent = server.streamFile(file, "text/html");//发送内容
    file.close();          //关闭文件
    return;
}
else
{
    handleNotFound(); //404
}
}


void setup() {
SPIFFS.begin();

// 设置内网
IPAddress softLocal(192,168,128,1);
IPAddress softGateway(192,168,128,1);
IPAddress softSubnet(255,255,255,0);
WiFi.softAPConfig(softLocal, softGateway, softSubnet);
String apName = ("ESP8285_"+(String)ESP.getChipId());
const char *softAPName = apName.c_str();
WiFi.softAP(softAPName, "ap20180422");
IPAddress myIP = WiFi.softAPIP();

//请求响应对象
server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} ); //这句意义重大:当主页不正常时,至少能通过inline显示一个“好”页面
server.on ( "/h5c_001.html", ch_page );
server.onNotFound ( handleNotFound );
server.begin();

}

void loop() {
server.handleClient();
}



在OCIDE编译和上存程序都没有问题,不过上存页面文件就出错了,当然这个功能在8266那时我就没配置成功过:'(
然而强强好像弄成功了

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/OCIDE_012_01.png


然后回到官方的Arduino 1.6.12,这次选择esp8266版本为2.1.0
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/Arduino_1.6.12_2.1.0_01.png

值得留意的是这个版本并木有8285这个型号的开发板,所以我用8266来代替
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/Arduino_1.6.12_2.1.0_02.png

代码能编译,不过程序无法上存,页面文件也上存不了

还是官方的Arduino 1.6.12,这次把esp8266版本升级到2.3.0
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/Arduino_1.6.12_2.3.0_01.png

2.3.0开始有8285选项了
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/Arduino_1.6.12_2.3.0_02.png

代码编译的时候提示“建构已经变更,全部重新建构”
看来是大版本更新,然而还是程序和文件都无法上存

我有一种猜测:把GPIO 0接地,强制进入上存模式,再上存。所以这里还想请教下毅神,GPIO 0有没有接出来呢?

虽然官方版本的arduino全灭,不过OCIDE还是把程序上存成了,那么现在接上锂电模块,看看程序除了主页以外的功能是否正常

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/8285_li_wifi_01.jpg
首先WIFI是能连接上的 。嗯,我看到了一丝曙光

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180422/8285_li_wifi_02.jpg
然后inline页面也可以正常显示 :victory:


当然这里不会是最后,关键的ADC功能还没玩到呢,那么之后还有更多的测试,敬请期待

另外,希望毅神帮忙看看,有没有办法让这板子强制进入上存模式(GPIO 0接地)


弘毅 发表于 2018-4-22 21:55:44

wing 发表于 2018-4-22 20:05
其实我个人来说找找ADC编号是一个好玩的小游戏,所以我完全不在乎那个印。
当然就产品来说总是要不断完善 ...

GPIO0没有接出来~~~LED下方的圆形mark点,右侧的黑色零件管脚就是GPIO0

darkorigin 发表于 2018-4-22 22:02:03

弘毅 发表于 2018-4-18 20:20
。。。。。我居然忘了画丝印。。。

不是有各脚的丝印么?还要什么丝印

wing 发表于 2018-4-23 13:19:14


在毅神的帮助下终于找了GPIO 0的位置了,图上的蓝框和绿框



这里附一份全尺寸的原图

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/OC8285_GPIO_0.jpg

当上存程序或者上存文件之前就要让GPIO 0接地,整个上存过程都要一直保持

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/OC8285_li_00.jpg

首先是上存程序

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/arduino_1.6.12_2.3.0_01.png

然后再上存页面文件

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/arduino_1.6.12_2.3.0_03.png

终于官方版本的Arduino 1.6.12 + ESP8266 2.3.0 环境下也能完成开发工作了

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/arduino_1.6.12_2.3.0_02.png

这里是程序代码,注意这里和6楼的程序在页面文件名称上有些不同

//8266 AP +wswifi ssid=ESP8285xxxxxxxx pwd=ap20180422 访问 http://192.168.128.1/h5c_001.htm 可见网页
//页面使用SPIFFS文件保存


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>      //文件系统库SPIFFS

ESP8266WebServer server ( 80 );


void handleNotFound() {//404页面
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";

for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
}

server.send ( 404, "text/plain", message );// 返回信息给浏览器(状态码,Content-type, 内容)
}


void ch_page() {//主页面
if(SPIFFS.exists("/h5c_001.htm")){//如果文件存在
    File file = SPIFFS.open("/h5c_001.htm", "r");            //打开文件
    size_t sent = server.streamFile(file, "text/html");//发送内容
    file.close();          //关闭文件
    return;
}
else
{
    handleNotFound(); //404
}
}


void setup() {
SPIFFS.begin();

// 设置内网
IPAddress softLocal(192,168,128,1);
IPAddress softGateway(192,168,128,1);
IPAddress softSubnet(255,255,255,0);
WiFi.softAPConfig(softLocal, softGateway, softSubnet);
String apName = ("ESP8285_"+(String)ESP.getChipId());
const char *softAPName = apName.c_str();
WiFi.softAP(softAPName, "ap20180422");
IPAddress myIP = WiFi.softAPIP();

//请求响应对象
server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} );
server.on ( "/h5c_001.htm", ch_page );
server.onNotFound ( handleNotFound );
server.begin();

}

void loop() {
server.handleClient();
}




页面文件名称为h5c_001.htm,位置在程序代码目录下的data文件夹中。
至于页面功能就不要太重视了,反正就是个测试。
下面是页面文件代码

<html>
<head>
<title>practice20180106</title>

<style>
   canvas {
       cursor: pointer;
       border: 1px solid black;
   }
</style>
   
   
<script>   
    function drawSomething() {
      
    var canvas;
    var context;
      
    canvas = document.getElementById("canvas");
    context = canvas.getContext("2d");      
      
    // 清除画布,准备绘制    运行前要删除注释
    context.clearRect(0, 0, canvas.width, canvas.height);   

    // 绘制圆圈
    context.beginPath();   
    context.globalAlpha = 0.85;
    context.beginPath();
    context.arc(100, 100, 25, 0, Math.PI*2);
    context.fillStyle = "pink";
    context.strokeStyle = "black";

    context.lineWidth = 1;

    context.fill();
    context.stroke();
      
    // 绘制圆弧   
    context.beginPath();   
    context.globalAlpha = 0.85;
    context.beginPath();
    context.arc(150, 150, 80, Math.PI*1.3, Math.PI*1.5,false);
    context.fillStyle = "blue";
    context.strokeStyle = "black";

    context.lineWidth = 4;

    //context.fill();
    context.stroke();         
      

      
    // 绘制新圆弧   
    context.beginPath();   
    context.globalAlpha = 1;
    context.beginPath();
    context.arc(1300, 910, 500,0, Math.PI*1.5);
    context.fillStyle = "blue";
    context.strokeStyle = "black";

    context.lineWidth = 2;

    //context.fill();
    context.stroke();   
      
      
    // 绘制曲线   
    context.beginPath();         
    context.lineWidth = 3;
    context.strokeStyle = "#cd2828";

    //把笔移动到起点位置
    context.moveTo(0, 240);

    //创建变量,保存两个控制点以及曲线终点信息
    var control1_x = 0;
    var control1_y = 100;
    var control2_x = 333;
    var control2_y = 840;
    var endPointX = 333;
    var endPointY = 700;

    //绘制曲线
    context.bezierCurveTo(control1_x, control1_y, control2_x, control2_y, endPointX, endPointY);
    context.stroke();      
    }
   
    function canvasClick(e) {

    var canvas;
    canvas = document.getElementById("canvas");      

    // 取得画布上被单击的点   
    var clickX = e.pageX - canvas.offsetLeft;
    var clickY = e.pageY - canvas.offsetTop;   
   
    //显示坐标         
    var context;
    context = canvas.getContext("2d");   

    // 设置字体      
    context.font = "Bold 20px Arial";
    // 设置对齐方式      
    context.textAlign = "left";
    // 设置填充颜色      
    context.fillStyle = "#008600";
    // 设置字体内容,以及在画布上的位置      
    context.fillText("X="+clickX+"Y="+clickY, 100, 50);   
    }
</script>      
   

</head>

<body>

<canvas id="canvas" width="1000" height="700" onmousedown="canvasClick(event)">
</canvas>

<div>
    <button onclick="drawSomething()">make_round</button>
</div>

</body>
</html>

然后这里是完整的代码


所有都准备好了,那么接上锂电,打开开关,看看测试效果

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180423/OC8285_li_01.jpg

至此SPIFFS文件功能也终于通过测试了,接下来应该就是期待已久的ADC了吧

wing 发表于 2018-4-27 23:19:18

本帖最后由 wing 于 2018-4-27 23:23 编辑

让大家久等了的 ADS1015 4路 ADC 读取程序终于出来了。
本程序还是由8285开AP,做网页服务器,
然后在SPIFFS保存一个页面,
访问这页面后会定时去获取ADS1015 的 4路 ADC数值。
本程序在官方Arduino 1.6.12上开发和编译上存,网页文件由Brackets 1.11编写。

首先是主程序

//8266 AP +wswifi ssid=ESP8285xxxxxxxx pwd=ap20180422 访问 http://192.168.128.1/read_adc.htm 可见网页
//页面使用SPIFFS文件保存,还增加了定时异步更新当前所有adc数值


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>      //文件系统库SPIFFS

#include <Wire.h>               //iic接口库
#include <Adafruit_ADS1015.h>   //adc库,居然是出自Ada的

Adafruit_ADS1015 ads;    //定义adc变量

ESP8266WebServer server ( 80 );   //定义web服务

void handleNotFound() {//404页面
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";

for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
}

server.send ( 404, "text/plain", message );// 返回信息给浏览器(状态码,Content-type, 内容)
}


void ra_page() {//读取adc数值页面
if(SPIFFS.exists("/read_adc.htm")){//如果文件存在
    File file = SPIFFS.open("/read_adc.htm", "r");            //打开文件
    size_t sent = server.streamFile(file, "text/html");//发送内容
    file.close();          //关闭文件
    return;
}
else
{
    handleNotFound(); //404
}
}

void adc_values() {//返回adc值
String p= "";
int adc;
unsigned long systime;

systime=millis();       //系统时间
p= String(systime)+":";

adc = ads.readADC_SingleEnded(0);   //获取各路adc的数值
p=p+String(adc);
adc = ads.readADC_SingleEnded(1);
p=p+","+String(adc);
adc = ads.readADC_SingleEnded(2);
p=p+","+String(adc);
adc = ads.readADC_SingleEnded(3);
p=p+","+String(adc);

server.send(200, "text/plain", p);//抛出返回信息如果整个过程都没出错,应该返回这样的信息   系统运行毫秒数:0路电压,1路电压,2路电压,3路电压
}


void setup() {
SPIFFS.begin();//这个文件系统实例好像在头文件里已经定义好了,无需声明直接开始工作吧

// 设置内网
IPAddress softLocal(192,168,128,1);
IPAddress softGateway(192,168,128,1);
IPAddress softSubnet(255,255,255,0);
WiFi.softAPConfig(softLocal, softGateway, softSubnet);
String apName = ("ESP8285_"+(String)ESP.getChipId());
const char *softAPName = apName.c_str();
WiFi.softAP(softAPName, "ap20180422");
IPAddress myIP = WiFi.softAPIP();

//请求响应对象
server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} ); //这句意义重大:当主页面文件无法顺利上存时,至少能通过inline显示一个“好”页面
server.on ( "/read_adc.htm", ra_page );
server.on ( "/adc", adc_values );
server.onNotFound ( handleNotFound );
server.begin();    //启动web服务

ads.begin();//adc开始工作吧
}

void loop() {
server.handleClient();
}




要提醒大家的是,arduino 1.6.13 + ESP8266 2.3.0 环境下对OC这款板子的自动上存模式支持并不怎么,所以如果要顺利上存程序和页面文件的话最好还是手动把GPIO 0 接地,具体方法请参考9楼

接下来是网页文件代码

<html>
    <head>
      <title>read adc values</title>
      <!--ads1015-->
      <script type="text/javascript">   
      function read_adc()//get adc values
      {
            var url;
            url ="adc";

            var xhr = new XMLHttpRequest();
            xhr.open("GET", url, true);
            xhr.onreadystatechange = function(e){
            if (xhr.readyState == 4) {
            var rtn = xhr.responseText;
            document.getElementById("textarea").value+= rtn+"\n";
            }
            };   

            xhr.send();
      }
            
      function button_gogogo() //btn_go make anything start once
      {
            document.getElementById("btn_go").disabled = true;
            read_adc();
            self.setInterval('read_adc()',50000);
      }            
      </script>
      
    </head>
    <body>
      <textarea id="textarea" rows=55 cols=65></textarea>
      <input id="btn_go" type="button" value="gogogo" onclick="button_gogogo()" />   
    </body>
</html>   

完整的程序压缩包

页面上有一个硕大的文本框,然后还有一个按钮,点击按钮后页面每隔一段时间就会去获取一次8285的运行时间和0~3路ADC的数值,并逐行显示在文本框上。

在手机上的样子大概是这样的
https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180427/8285_adc_test02.jpg

是的,拍得不怎么样,没对好焦

那么现在来说说ADC测量对象:也就是OC的锂电池,8285由锂电模块提供5V供电,然后把ADS1015的其中2路ADC分别接到18650电池的正负极,另外两个则悬空。


https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180427/8285_adc_test04.jpg

然后用手机连上8285开的WIFI服务,打开页面。
手机上的测试存在一个问题:当黑屏的时候,浏览器也跟着一起休眠了,无法触发页面的定时事件,也就获取不到数值了
下次改下页面弄到PC上再试过

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180427/8285_adc_test03.jpg

https://raw.githubusercontent.com/FreezingEye/pedrail-1.5/master/forum_image/20180427/8285_adc_test01.jpg

最后简单分析下采集的数据,
测试从今天下午1点半左右开始,
留意文本框的首行
第一个数字41145,这个是8285运作的时间,单位是毫秒,也就是这时运行了41秒
第二个数字是0号ADC的数值这时是4094 这个值比较接近2的12次方,这个值在整个实验过程变化都很小,我认为它表示的是一个接近0的电压,也就是接着18650负极
第三个数字 这个数值变化也不大,应该是悬空的
第四个数字 1373,这个数值一直在慢慢减少,根据ADS1x15的资料
//                                                                                             ADS1015ADS1115
//                                                                                             -------   -------
// ads.setGain(GAIN_TWOTHIRDS);// 2/3x gain +/- 6.144V1 bit = 3mV      0.1875mV (default)
// ads.setGain(GAIN_ONE);            // 1x gain   +/- 4.096V1 bit = 2mV      0.125mV
// ads.setGain(GAIN_TWO);             // 2x gain   +/- 2.048V1 bit = 1mV      0.0625mV
// ads.setGain(GAIN_FOUR);            // 4x gain   +/- 1.024V1 bit = 0.5mV    0.03125mV
// ads.setGain(GAIN_EIGHT);         // 8x gain   +/- 0.512V1 bit = 0.25mV   0.015625mV
// ads.setGain(GAIN_SIXTEEN);      // 16x gain+/- 0.256V1 bit = 0.125mV0.0078125mV

默认状态下ADS1015 每一点表示3毫伏,1373*0.03=4.11 接近18650最高电压4.2,这时电池基本是满电的
第五个数字 这个数值变化也不大,应该也是悬空的

测试一直持续了将近5个小时,直到晚上六点多。
最后一行时间为19410742,换算为小时19410742/(1000*60*60)=4.8
电压为1246,1246*0.03=3.77

当然上面的计算只是我自己的理解,还请毅毅强强多多指正。


弘毅 发表于 2018-4-28 09:59:24

嗯。。。。这个ADC支持差分输入~~~

wing 发表于 2018-4-28 13:01:59

其实我没弄明白这个函数ads.setGain();是干什么的,看上去会影响量程和精度

弘毅 发表于 2018-4-28 13:54:49

wing 发表于 2018-4-28 13:01
其实我没弄明白这个函数ads.setGain();是干什么的,看上去会影响量程和精度

内部放大器放大倍率调整吧
页: [1]
查看完整版本: 新款到货的OCROBOT ALPHA开发板 :ESP8285 + ADS1015 (内含4路ADC 读取程序实例!)