galaxy 发表于 2017-4-15 23:21:41

使用 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 接口

供電方式請另外單獨供電,不要和待測端共電,
會量不準的

老胖熊 发表于 2017-4-16 13:38:02

又一个5110的例子

jasonwang1208 发表于 2017-4-17 10:27:06

3Q for sharing.

yh666 发表于 2017-8-8 13:43:38

I2 = tempI2 / 0.01626 ;}// 使用的分流器為0.015Ω ±1% ±20ppm/℃ 5W 的電阻
这个分流电阻怎么接的?

qq177128496 发表于 2017-8-15 17:55:51

楼主你好,可以分享下ads1115 使用的庫吗?百度搜不到

galaxy 发表于 2017-8-15 21:21:34

本帖最后由 galaxy 于 2017-8-15 21:24 编辑

回 yh666 兄,您要的電路圖我一直找不到,待我有空時再畫個新的po上來.....不好意思
要注意的是 arduino 主板及 ADS1115 模塊是共同使用 5V 的電源,與待測端的電壓,電流不共電
(因為共電會量不準)

回 qq177128496 兄,小弟愚昧不知如何將庫分享,今將當初下載處po上來
https://github.com/adafruit/Adafruit_ADS1X15

汇-研 发表于 2017-8-17 17:13:24

厉害厉害!!!

qq177128496 发表于 2017-8-23 19:42:01

galaxy 发表于 2017-8-15 21:21
回 yh666 兄,您要的電路圖我一直找不到,待我有空時再畫個新的po上來.....不好意思
要注意的是 arduino 主 ...

非常感谢,

wsy0315 发表于 2017-9-18 19:53:05

5110不错,我也有一个不过好久没用过了

galaxy 发表于 2017-9-25 01:31:16

本帖最后由 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 02:18:10

本帖最后由 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() );
}                        

galaxy 发表于 2017-9-25 05:36:40

這是原始文件裡面的範例

有提到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);
}

yuqingshan 发表于 2017-9-25 10:59:45

谢谢楼主分享好资源!不过编译通过不过,显示是:DHT22.h的问题,网上下载的DHT22.h文件不行,可否共享您的DHT22.h文件?谢谢。

galaxy 发表于 2017-9-25 13:43:14

這樣不曉得可不可以 ?

yuqingshan 发表于 2017-9-29 09:55:58

谢谢楼主分享好资源!请楼主可否分享测量电压、电流的电路?我用MEGA ADK +ADS1015结果显示是V=3.***,I=32.***不断跳动,感觉不稳定?手靠近ADS1015的A0-A3脚变化10倍或更大,可像无法测量用?
页: [1] 2 3
查看完整版本: 使用 u8g 庫 + 5110 顯示器 + ADS1115 (16 bit ADC) 的電壓電壓流表