之前那个开箱帖做了很多的程序测试,看上比较凌乱。
这次单独发一帖整理一个使用 ESP8285 + ADS1015 + 锂电模块 的应用实例程序:电池电量监视器
除了上面说那套OC开发板之外还需要一个台PC电脑,chrome浏览器65版,一个和PC联网的带WIFI功能路由器。
8285的主程序代码需要自行修改填上WIFI SSID和密码,8285的IP是自动获取的,要访问到监视器页面就需要知道IP地址,我是在路由查出来的。
监视器页面有一个gogogo的按钮,点击后就会开始记录电池电量变化,每隔10分钟刷新一次,同时绘制柱状图表
从满电开始到完全放电可能会超过10小时,如果电脑进入休眠,定时记录也会停止,所以最好把休眠禁止掉
这里是主程序代码 - //8285链接wifi路由 IP是动态获取的 至于怎么获得这个IP自己想办法 访问 http://x.x.x.x/read_adc_chart.htm 可见网页
- //页面使用SPIFFS文件保存,页面定时异步更新当前所有adc数值,并且显示电量图表
- #include <ESP8266WiFi.h>
- #include <ESP8266WebServer.h>
- #include <FS.h> //文件系统库SPIFFS
- #include <Wire.h> //iic接口库
- #include <Adafruit_ADS1015.h> //adc库,居然是出自Ada的
- const char *ssid = "你的WIFI"; //wifi ssid
- const char *password = "你的WIFI密码"; //wifi 密码
- 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_chart.htm")){ //如果文件存在
- File file = SPIFFS.open("/read_adc_chart.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() {
- WiFi.begin ( ssid, password ); //wifi链接
- delay(3500);
-
- SPIFFS.begin(); //这个文件系统实例好像在头文件里已经定义好了,无需声明直接开始工作吧
- //web服务请求响应对象
- server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} ); //这句意义重大:当主页面文件无法顺利上存时,至少能通过inline显示一个“好”页面
- server.on ( "/read_adc_chart.htm", ra_page );
- server.on ( "/adc", adc_values );
- server.onNotFound ( handleNotFound );
- server.begin(); //启动web服务
- ads.begin(); //adc开始工作吧
- }
- void loop() {
- server.handleClient();
- }
复制代码
由于这个程序是在Arduino 1.6.12 + Esp866 2.3.0版本下写的,上存程序和文件都需要手动把GPIO 0接地
如果想更加了解这个问题 请看这里 http://www.geek-workshop.com/thread-37411-1-1.html
接着是页面代码,页面文件的位置在主程序目录的data文件夹下
- <html>
- <head>
- <title>read adc values show chart</title>
- <!--ESP8285 + ads1015-->
-
- <style>
- canvas {
- cursor: pointer;
- border: 1px solid black;
- }
- </style>
-
- <script type="text/javascript">
- var ar_time = new Array();
- var ar_volt = new Array();
-
- 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";
-
- var ar_str = rtn.split(",");
- ar_time.push(ar_str[0]);
- ar_volt.push(ar_str[3]);
- }
- };
- xhr.send();
- draw_chart();
- }
-
- function draw_chart() {
- var canvas;
- var context;
- canvas = document.getElementById("canvas");
- context = canvas.getContext("2d");
- context.clearRect(0, 0, canvas.width, canvas.height);
-
- context.beginPath();
- context.lineWidth = 25;
- context.strokeStyle = "#cd2828";
-
- var i,v;
- for (i = 0; i < ar_volt.length; i++) {
- context.moveTo(65+i*25, 400);
- v=ar_volt[i];
- context.lineTo(65+i*25, 1400-v);
-
- context.save();
- context.translate(65+i*25,410);
- context.rotate(Math.PI / 2);
-
- var n,h;
- n=Math.floor(ar_time[i] / (1000*60) );
- h=Math.floor(n / 60);
- n= n % 60;
- context.fillText(h+" : "+n,0,0);
-
- var m=ar_volt[i]*0.003;
- context.fillText(m.toFixed(3)+'v',0,13);
-
- context.restore();
- }
- context.stroke();
- }
-
-
- function button_gogogo() //btn_go make anything start once
- {
- document.getElementById("btn_go").disabled = true;
- read_adc();
- self.setInterval('read_adc()',600000);
- }
- </script>
-
- </head>
- <body>
- <textarea id="textarea" rows=5 cols=100></textarea>
- <input id="btn_go" type="button" value="gogogo" onclick="button_gogogo()" />
- <div>
- <canvas id="canvas" width="1300" height="500"></canvas>
- </div>
- </body>
- </html>
复制代码
页面没写什么注释,因为整个文件会原原本本地上存到8285,就算注释也需要占用8285宝贵的存储空间,而且读取文件的速度也不怎么快。
其实注释也没什么用的,无论我怎么写也无法说清楚这个页面为什么只能在chrome下正常工作,而Internet Explorer则不行。
所以如果前端出了什么问题,一定就是浏览器的错
如果你想更加了解SPIFFS文件 请参阅这里 https://github.com/esp8266/arduino-esp8266fs-plugin
到目前为止我未能完完整整地玩一次从满电倒完全放电的测试,那么你想试试么?
|