极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 65309|回复: 30

使用 u8g 庫 + 5110 顯示器 + ADS1115 (16 bit ADC) 的電壓電壓流表

[复制链接]
发表于 2017-4-15 23:21:41 | 显示全部楼层 |阅读模式
本帖最后由 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[10];

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2017-4-16 13:38:02 | 显示全部楼层
又一个5110的例子
回复 支持 反对

使用道具 举报

发表于 2017-4-17 10:27:06 | 显示全部楼层
3Q for sharing.
回复 支持 反对

使用道具 举报

发表于 2017-8-8 13:43:38 | 显示全部楼层
I2 = tempI2 / 0.01626 ;}  // 使用的分流器為0.015Ω ±1% ±20ppm/℃ 5W 的電阻
这个分流电阻怎么接的?
回复 支持 反对

使用道具 举报

发表于 2017-8-15 17:55:51 | 显示全部楼层
楼主你好,可以分享下ads1115 使用的庫吗?百度搜不到
回复 支持 反对

使用道具 举报

 楼主| 发表于 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-23 19:42:01 | 显示全部楼层
galaxy 发表于 2017-8-15 21:21
回 yh666 兄,您要的電路圖我一直找不到,待我有空時再畫個新的po上來.....不好意思
要注意的是 arduino 主 ...

非常感谢,
回复 支持 反对

使用道具 举报

发表于 2017-9-18 19:53:05 来自手机 | 显示全部楼层
5110不错,我也有一个不过好久没用过了
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
這個約是我一年前的作品,待我研究好了再回復.....
很多都忘了....不好意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-25 02:18:10 | 显示全部楼层
本帖最后由 galaxy 于 2017-9-25 03:20 编辑

>>另外我还想请问,模拟信号经adc处理后,怎么再转化成电压信号显示在oled上??

這是我當初修改的檔案,這是一個太陽能控制器
完成大部份,細部沒時間去完成.
有用到  I2C oled / BH1750 光度計 / ADS1115  16big / ...等
給妳參考參考

//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[10];
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() );
}                        

回复 支持 反对

使用道具 举报

 楼主| 发表于 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!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.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);
}
回复 支持 反对

使用道具 举报

发表于 2017-9-25 10:59:45 | 显示全部楼层
谢谢楼主分享好资源!不过编译通过不过,显示是:DHT22.h的问题,网上下载的DHT22.h文件不行,可否共享您的DHT22.h文件?谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-25 13:43:14 | 显示全部楼层
這樣不曉得可不可以 ?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-9-29 09:55:58 | 显示全部楼层
谢谢楼主分享好资源!请楼主可否分享测量电压、电流的电路?我用MEGA ADK +ADS1015结果显示是V=3.***,I=32.***  不断跳动,感觉不稳定?手靠近ADS1015的A0-A3脚变化10倍或更大,可像无法测量用?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:43 , Processed in 0.056704 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表