Browse Source

I2C and ADC121 implementation

fastled
Xose Pérez 8 years ago
parent
commit
dd4e2037da
7 changed files with 132 additions and 14 deletions
  1. +1
    -1
      code/espurna/config/arduino.h
  2. +9
    -0
      code/espurna/config/general.h
  3. +22
    -6
      code/espurna/config/sensors.h
  4. +52
    -6
      code/espurna/emon.ino
  5. +3
    -0
      code/espurna/espurna.ino
  6. +43
    -0
      code/espurna/i2c.ino
  7. +2
    -1
      code/platformio.ini

+ 1
- 1
code/espurna/config/arduino.h View File

@ -35,7 +35,7 @@
//#define ENABLE_DHT 1
//#define ENABLE_DS18B20 1
//#define ENABLE_EMON 1
#define ENABLE_EMON 1
//#define ENABLE_HLW8018 1
//#define ENABLE_RF 1
//#define ENABLE_FAUXMO 0


+ 9
- 0
code/espurna/config/general.h View File

@ -95,6 +95,15 @@
#define MQTT_USE_GETTER ""
#define MQTT_USE_SETTER ""
// -----------------------------------------------------------------------------
// I2C
// -----------------------------------------------------------------------------
#define ENABLE_I2C 1
#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 14
#define I2C_CLOCK_STRETCH_TIME 200
#define I2C_SCL_FREQUENCY 1000
// -----------------------------------------------------------------------------
// DOMOTICZ


+ 22
- 6
code/espurna/config/sensors.h View File

@ -35,16 +35,32 @@
// Enable support by passing ENABLE_EMON=1 build flag
//--------------------------------------------------------------------------------
#define EMON_CURRENT_PIN 0
#define EMON_ANALOG_PROVIDER 0
#define EMON_ADC121_PROVIDER 1
#define EMON_PROVIDER EMON_ADC121_PROVIDER
#if EMON_PROVIDER == EMON_ANALOG_PROVIDER
#define EMON_CURRENT_PIN 0
#define EMON_ADC_BITS 10
#define EMON_REFERENCE_VOLTAGE 1.0
#define EMON_CURRENT_PRECISION 1
#define EMON_CURRENT_OFFSET 0.25
#endif
#if EMON_PROVIDER == EMON_ADC121_PROVIDER
#define EMON_ADC121_ADDRESS 0x50
#define EMON_ADC_BITS 12
#define EMON_REFERENCE_VOLTAGE 3.3
#define EMON_CURRENT_PRECISION 2
#define EMON_CURRENT_OFFSET 0
#endif
#define EMON_CURRENT_RATIO 30
#define EMON_SAMPLES 1000
#define EMON_INTERVAL 10000
#define EMON_MEASUREMENTS 6
#define EMON_ADC_BITS 10
#define EMON_REFERENCE_VOLTAGE 1.0
#define EMON_CURRENT_PRECISION 1
#define EMON_CURRENT_OFFSET 0.25
#define EMON_MAINS_VOLTAGE 230
#define EMON_CURRENT_RATIO 180
#define EMON_POWER_TOPIC "/power"
//--------------------------------------------------------------------------------


+ 52
- 6
code/espurna/emon.ino View File

@ -9,11 +9,49 @@ Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
#if ENABLE_EMON
#include <EmonLiteESP.h>
#include "brzo_i2c.h"
// ADC121 Registers
#define ADC121_REG_RESULT 0x00
#define ADC121_REG_ALERT 0x01
#define ADC121_REG_CONFIG 0x02
#define ADC121_REG_LIMITL 0x03
#define ADC121_REG_LIMITH 0x04
#define ADC121_REG_HYST 0x05
#define ADC121_REG_CONVL 0x06
#define ADC121_REG_CONVH 0x07
EmonLiteESP emon;
double _current = 0;
unsigned int _power = 0;
// -----------------------------------------------------------------------------
// Provider
// -----------------------------------------------------------------------------
unsigned int currentCallback() {
#if EMON_PROVIDER == EMON_ANALOG_PROVIDER
return analogRead(EMON_CURRENT_PIN);
#endif
#if EMON_PROVIDER == EMON_ADC121_PROVIDER
uint8_t buffer[2];
brzo_i2c_start_transaction(EMON_ADC121_ADDRESS, I2C_SCL_FREQUENCY);
buffer[0] = ADC121_REG_RESULT;
brzo_i2c_write(buffer, 1, false);
brzo_i2c_read(buffer, 2, false);
brzo_i2c_end_transaction();
unsigned int value;
value = (buffer[0] & 0x0F) << 8;
value |= buffer[1];
return value;
#endif
}
// -----------------------------------------------------------------------------
// EMON
// -----------------------------------------------------------------------------
@ -30,10 +68,6 @@ double getCurrent() {
return _current;
}
unsigned int currentCallback() {
return analogRead(EMON_CURRENT_PIN);
}
void powerMonitorSetup() {
// backwards compatibility
@ -53,6 +87,15 @@ void powerMonitorSetup() {
);
emon.setPrecision(EMON_CURRENT_PRECISION);
#if EMON_PROVIDER == EMON_ADC121_PROVIDER
uint8_t buffer[2];
buffer[0] = ADC121_REG_CONFIG;
buffer[1] = 0x00;
brzo_i2c_start_transaction(EMON_ADC121_ADDRESS, I2C_SCL_FREQUENCY);
brzo_i2c_write(buffer, 2, false);
brzo_i2c_end_transaction();
#endif
apiRegister("/api/power", "power", [](char * buffer, size_t len) {
snprintf(buffer, len, "%d", _power);
});
@ -97,7 +140,10 @@ void powerMonitorLoop() {
float mainsVoltage = getSetting("emonMains", EMON_MAINS_VOLTAGE).toFloat();
//DEBUG_MSG("[ENERGY] Power now: %dW\n", int(_current * mainsVoltage));
char current[6];
dtostrf(_current, 5, 2, current);
DEBUG_MSG("[ENERGY] Current: %sA\n", current);
DEBUG_MSG("[ENERGY] Power: %dW\n", int(_current * mainsVoltage));
// Update websocket clients
char text[20];
@ -112,7 +158,7 @@ void powerMonitorLoop() {
measurements = 0;
char power[6];
snprintf(power, "%d", 6, _power);
snprintf(power, 6, "%d", _power);
mqttSend(getSetting("emonPowerTopic", EMON_POWER_TOPIC).c_str(), power);
#if ENABLE_DOMOTICZ
domoticzSend("dczPowIdx", power);


+ 3
- 0
code/espurna/espurna.ino View File

@ -107,6 +107,9 @@ void setup() {
webSetup();
ntpSetup();
#if ENABLE_I2C
i2cSetup();
#endif
#if ENABLE_FAUXMO
fauxmoSetup();
#endif


+ 43
- 0
code/espurna/i2c.ino View File

@ -0,0 +1,43 @@
/*
I2C MODULE
Copyright (C) 2017 by Xose Pérez <xose dot perez at gmail dot com>
*/
#if ENABLE_I2C
#include "brzo_i2c.h"
void i2cScan() {
uint8_t address;
uint8_t response;
uint8_t buffer[1];
int nDevices = 0;
for (address = 1; address < 128; address++) {
brzo_i2c_start_transaction(address, I2C_SCL_FREQUENCY);
brzo_i2c_ACK_polling(1000);
response = brzo_i2c_end_transaction();
if (response == 0) {
Serial.printf("[I2C] Device found at address 0x%02X\n", address);
nDevices++;
} else if (response != 32) {
Serial.printf("[I2C] Unknown error at address 0x%02X\n", address);
}
}
if (nDevices == 0) Serial.println("[I2C] No devices found");
}
void i2cSetup() {
brzo_i2c_setup(I2C_SDA_PIN, I2C_SCL_PIN, I2C_CLOCK_STRETCH_TIME);
i2cScan();
}
#endif

+ 2
- 1
code/platformio.ini View File

@ -16,6 +16,7 @@ lib_deps =
NtpClientLib
OneWire
DallasTemperature
Brzo I2C
https://bitbucket.org/xoseperez/justwifi.git
https://bitbucket.org/xoseperez/hlw8012.git
https://bitbucket.org/xoseperez/fauxmoesp.git
@ -88,7 +89,7 @@ extra_script = pio_hooks.py
build_flags = -g -Wl,-Tesp8266.flash.1m128.ld -DDEBUG_PORT=Serial -DSONOFF
upload_speed = 115200
upload_port = "192.168.4.1"
upload_flags = --auth=fibonacci --port 8266
upload_flags = --auth=Algernon1 --port 8266
[env:sonoff-dht22-debug]
platform = espressif8266


Loading…
Cancel
Save