使用 u8g 庫 + 5110 顯示器 + ADS1115 (16 bit ADC) 的電壓電壓流表
本帖最后由 galaxy 于 2017-12-2 14:23 编辑//0022 可過
//http://arduino-er.blogspot.tw/2015/05/temperature-humidity-monitor-using.html
// 度 C 有完整顯示
#include "U8glib.h"
U8GLIB_PCD8544 u8g(3, 4, 7, 5, 6); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
#include <DHT22.h>
#define DHT22_PIN_1 10 //定義 DHT22 使用的腳位
#include <Wire.h>
#include <Adafruit_ADS1015.h> // ads1115 使用的庫, 同ads1015
Adafruit_ADS1115 ads(0x48);
Adafruit_ADS1115 ads1115;
float Volt0 = 0.0;
float Volt1 = 0.0;
float Volt2 = 0.0;
float Volt3 = 0.0;
float tempV0 = 0.0;
float tempV1 = 0.0;
float tempV2 = 0.0;
float tempV3 = 0.0;
float Vr31=50129;//分壓電阻 50K,實際用電表測量為 50.129K
float Vr32=10008;//分壓電阻 1K,際用四綫式電表測量為 1.0008K
//為提高準確度,電阻使用 25ppm 的電阻,還要再經電表測量實際阻值
float I2 = 0.0;
float tempI2 = 0.0;
DHT22 myDHT22_1(DHT22_PIN_1);
char str;
void setup() {
pinMode(2,OUTPUT); // D2 設為輸出 (蜂鳴器)
ads1115.begin();
}
void loop(void) {
int16_t adc0, adc1, adc2, adc3;
float Volt0, Volt1, Volt2, Volt3;
{ adc3 = ads1115.readADC_SingleEnded(3);
Volt3 = (adc3 * 0.1875)/1000;}
{tempV3 = Volt3 ;
Volt3 = tempV3 / (Vr32/(Vr31+Vr32));}
{ adc2 = ads1115.readADC_SingleEnded(2);
Volt2 = (adc2 * 0.1875)/1000;}
{tempI2 = Volt2;
tempI2 = (adc2 * 0.1875)/1000;
I2 = tempI2 / 0.01626 ;}// 使用的分流器為0.015Ω ±1% ±20ppm/℃ 5W 的電阻
DHT22_ERROR_t errorCode;
errorCode = myDHT22_1.readData();
float h = (myDHT22_1.getHumidity()); //讀取濕度
float t = (myDHT22_1.getTemperatureC()); //讀取溫度
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB14); //設定字型 14 Pixel Hifh
//字型設定可在此網址找/ https://github.com/olikraus/u8glib/wiki/fontsize
//判斷式要放在 本大括號內才會在屏幕上顯示
u8g.drawStr(0, 14, "V="); // (橫點,縱點, "V=");
u8g.drawStr(26, 14, dtostrf(Volt3, 5, 3, str));// (橫點,縱點,讀取變數(電壓,5,2,變數);
u8g.drawStr(0, 30, "A="); // (橫點,縱點, "I=");
u8g.drawStr(26, 30, dtostrf(I2, 5, 3, str));// (橫點,縱點,讀取變數(電壓,5,2,變數);
u8g.setFont(u8g_font_helvR08); //設定字型 8 Pixel Hifh
u8g.drawStr( 0, 39, "T="); // (橫點,縱點, "T=");
u8g.drawStr(10, 39, dtostrf(t, 5, 1, str));// (橫點,縱點,讀取變數(溫度,5,2,變數);
u8g.drawStr(37, 39, "\260C"); // (橫點,縱點, "\260C");
//u8g.drawStr( 0, 48, "H="); // (橫點,縱點, "H=");
//u8g.drawStr(13, 48, dtostrf(h, 5, 1, str));//(橫點,縱點,讀取變數(濕,5,2,變數);
//u8g.drawStr(40, 48, "%"); // (橫點,縱點, "%");
if (t>=25)
{digitalWrite(2,HIGH);
u8g.drawStr(52, 39, "fan on");}
if (t<=24.9)
{digitalWrite(2,LOW);
u8g.drawStr(52, 39, "fan off");}
} while( u8g.nextPage() );
}
想要做個可調電源供應器的電壓,電流監視的~一直沒時間搞,只先完成這個
分壓電阻 50K 及 1 K
DHT22 接到 D10 接口
供電方式請另外單獨供電,不要和待測端共電,
會量不準的 又一个5110的例子 3Q for sharing.
I2 = tempI2 / 0.01626 ;}// 使用的分流器為0.015Ω ±1% ±20ppm/℃ 5W 的電阻
这个分流电阻怎么接的? 楼主你好,可以分享下ads1115 使用的庫吗?百度搜不到 本帖最后由 galaxy 于 2017-8-15 21:24 编辑
回 yh666 兄,您要的電路圖我一直找不到,待我有空時再畫個新的po上來.....不好意思
要注意的是 arduino 主板及 ADS1115 模塊是共同使用 5V 的電源,與待測端的電壓,電流不共電
(因為共電會量不準)
回 qq177128496 兄,小弟愚昧不知如何將庫分享,今將當初下載處po上來
https://github.com/adafruit/Adafruit_ADS1X15 厉害厉害!!! galaxy 发表于 2017-8-15 21:21
回 yh666 兄,您要的電路圖我一直找不到,待我有空時再畫個新的po上來.....不好意思
要注意的是 arduino 主 ...
非常感谢, 5110不错,我也有一个不过好久没用过了 本帖最后由 galaxy 于 2017-9-25 03:35 编辑
>>就是我的oled与1015都是i2c通信,这个问题要怎么解决???
https://zh.wikipedia.org/wiki/I%C2%B2C
不用怕都正確的把它接好 ( +V 接 +V , -V 接 -V , sda 接 sda , scl 接 scl )
因為 address (地址不同)
oled 有它自己的地址( u8glib 好像是直接指定驅動芯片)
1015也有它自己的地址 (若沒有錯的話應該是 0x48 )
都是住在同一條路上,但門牌號碼不同,所以不會沖到。
>>你用的电源是5v,为什么是* 0.1875
這個約是我一年前的作品,待我研究好了再回復.....
很多都忘了....不好意思 本帖最后由 galaxy 于 2017-9-25 03:20 编辑
>>另外我还想请问,模拟信号经adc处理后,怎么再转化成电压信号显示在oled上??
這是我當初修改的檔案,這是一個太陽能控制器
完成大部份,細部沒時間去完成.
有用到I2C oled / BH1750 光度計 / ADS111516big / ...等
給妳參考參考
//0022 可過
//http://arduino-er.blogspot.tw/2015/05/temperature-humidity-monitor-using.html
// 溫濕度
//使用 IC2 OLED屏幕
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
#include <BH1750.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads(0x48);
Adafruit_ADS1115 ads1115;
float Volt3 = 0.0;
float tempV3 = 0.0;
float Vr01=50000;
float Vr02=1000;
float I = 0.0;
float tempI = 0.0;
BH1750 lightMeter;
char str;
void setup() {
lightMeter.begin();
pinMode(2,OUTPUT); // D2 設為輸出 (蜂鳴器)
ads1115.begin();
}
void loop(void) {
uint16_t a = lightMeter.readLightLevel();
float l = (lightMeter.readLightLevel());
if (l>=600)
{digitalWrite(2,HIGH);}
if (l<=599)
{digitalWrite(2,LOW);}
int16_t adc0, adc1, adc2, adc3;
float Volt0, Volt1, Volt2, Volt3;
{ adc3 = ads1115.readADC_SingleEnded(3);
Volt3 = (adc3 * 0.1875)/1000;}
//Volt3 = adc3*0.00188; //下調
//Volt3 = adc3*0.00160007; //下調
{ tempV3 = Volt3 ;
Volt3 = tempV3 / (Vr02/(Vr01+Vr02));}
u8g.firstPage();
do {
u8g.setFont(u8g_font_6x13); //設定字型 9 Pixel Hifh
//字型設定可在此網址找/ https://github.com/olikraus/u8glib/wiki/fontsize
//判斷式要放在 本大括號內才會在屏幕上顯示
u8g.drawStr( 2,9,"Lux=");
u8g.drawStr(27,9,dtostrf(l,5,0,str));
if (l>=600)
{u8g.drawStr( 2,21,"Inverter ON");} // Lux大於600顯示 ON
if (l<=599)
{u8g.drawStr( 2,21,"Inverter OFF");} //Lux小於599顯示 OFF
u8g.drawStr( 2, 33, "V="); // (橫點,縱點, "V=");
u8g.drawStr(15, 33, dtostrf(Volt3, 5, 7, str));// (橫點,縱點,讀取變數(電壓,5,2,變數);
u8g.drawStr( 2, 44, "A="); // (橫點,縱點, "I=");
u8g.drawStr(15, 44, dtostrf(I, 5, 7, str));// (橫點,縱點,讀取變數(電壓,5,2,變數);
} while( u8g.nextPage() );
}
這是原始文件裡面的範例
有提到0.1875 是怎樣來的~
#include <Wire.h>
#include <Adafruit_ADS1015.h>
// Adafruit_ADS1115 ads;/* Use this for the 16-bit version */
Adafruit_ADS1015 ads; /* Use thi for the 12-bit version */
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");
Serial.println("Getting single-ended readings from AIN0..3");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
// The ADC input range (or gain) can be changed via the following
// functions, but be careful never to exceed VDD +0.3V max, or to
// exceed the upper and lower limits if you adjust the input range!
// Setting these values incorrectly may destroy your ADC!
// 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
ads.begin();
}
void loop(void)
{
int16_t adc0, adc1, adc2, adc3;
adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
adc2 = ads.readADC_SingleEnded(2);
adc3 = ads.readADC_SingleEnded(3);
Serial.print("AIN0: "); Serial.println(adc0);
Serial.print("AIN1: "); Serial.println(adc1);
Serial.print("AIN2: "); Serial.println(adc2);
Serial.print("AIN3: "); Serial.println(adc3);
Serial.println(" ");
delay(1000);
} 谢谢楼主分享好资源!不过编译通过不过,显示是:DHT22.h的问题,网上下载的DHT22.h文件不行,可否共享您的DHT22.h文件?谢谢。 這樣不曉得可不可以 ? 谢谢楼主分享好资源!请楼主可否分享测量电压、电流的电路?我用MEGA ADK +ADS1015结果显示是V=3.***,I=32.***不断跳动,感觉不稳定?手靠近ADS1015的A0-A3脚变化10倍或更大,可像无法测量用?