新款到货的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-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
。。。。。我居然忘了画丝印。。。
在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:图片均为一比一截屏,点击可以放大 :loveliness:吓屎了。。。看了下新图纸。。。ADC丝印加了。 本帖最后由 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接地)
wing 发表于 2018-4-22 20:05
其实我个人来说找找ADC编号是一个好玩的小游戏,所以我完全不在乎那个印。
当然就产品来说总是要不断完善 ...
GPIO0没有接出来~~~LED下方的圆形mark点,右侧的黑色零件管脚就是GPIO0 弘毅 发表于 2018-4-18 20:20
。。。。。我居然忘了画丝印。。。
不是有各脚的丝印么?还要什么丝印
在毅神的帮助下终于找了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: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
当然上面的计算只是我自己的理解,还请毅毅强强多多指正。
嗯。。。。这个ADC支持差分输入~~~ 其实我没弄明白这个函数ads.setGain();是干什么的,看上去会影响量程和精度 wing 发表于 2018-4-28 13:01
其实我没弄明白这个函数ads.setGain();是干什么的,看上去会影响量程和精度
内部放大器放大倍率调整吧
页:
[1]