|
/* |
|
* This sketch sends ads1115 current sensor data via HTTP POST request to thingspeak server. |
|
* It needs the following libraries to work (besides the esp8266 standard libraries supplied with the IDE): |
|
* |
|
* - https://github.com/adafruit/Adafruit_ADS1X15 |
|
* |
|
* designed to run directly on esp8266-01 module, to where it can be uploaded using this marvelous piece of software: |
|
* |
|
* https://github.com/esp8266/Arduino |
|
* |
|
* 2015 Tisham Dhar |
|
* licensed under GNU GPL |
|
*/ |
|
|
|
#include <ESP8266WiFi.h> |
|
#include <Wire.h> |
|
#include <Adafruit_ADS1015.h> |
|
|
|
// replace with your channel's thingspeak API key, |
|
String apiKey = "XXXXXXXXXXXXX"; |
|
//WIFI credentials go here |
|
const char* ssid = "XXXXXXXXXXX"; |
|
const char* password = "XXXXXXXXXXXXXXXXXXXXX"; |
|
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ |
|
|
|
const char* server = "api.thingspeak.com"; |
|
WiFiClient client; |
|
|
|
double offsetI; |
|
double filteredI; |
|
double sqI,sumI; |
|
int16_t sampleI; |
|
double Irms; |
|
|
|
double squareRoot(double fg) |
|
{ |
|
double n = fg / 2.0; |
|
double lstX = 0.0; |
|
while (n != lstX) |
|
{ |
|
lstX = n; |
|
n = (n + fg / n) / 2.0; |
|
} |
|
return n; |
|
} |
|
|
|
double calcIrms(unsigned int Number_of_Samples) |
|
{ |
|
/* Be sure to update this value based on the IC and the gain settings! */ |
|
float multiplier = 0.125F; /* ADS1115 @ +/- 4.096V gain (16-bit results) */ |
|
for (unsigned int n = 0; n < Number_of_Samples; n++) |
|
{ |
|
sampleI = ads.readADC_Differential_0_1(); |
|
|
|
// Digital low pass filter extracts the 2.5 V or 1.65 V dc offset, |
|
// then subtract this - signal is now centered on 0 counts. |
|
offsetI = (offsetI + (sampleI-offsetI)/1024); |
|
filteredI = sampleI - offsetI; |
|
//filteredI = sampleI * multiplier; |
|
|
|
// Root-mean-square method current |
|
// 1) square current values |
|
sqI = filteredI * filteredI; |
|
// 2) sum |
|
sumI += sqI; |
|
} |
|
|
|
Irms = squareRoot(sumI / Number_of_Samples)*multiplier; |
|
|
|
//Reset accumulators |
|
sumI = 0; |
|
//-------------------------------------------------------------------------------------- |
|
|
|
return Irms; |
|
} |
|
|
|
void setup() { |
|
Serial.begin(115200); |
|
delay(10); |
|
|
|
// We start by connecting to a WiFi network |
|
|
|
Serial.println(); |
|
Serial.println(); |
|
Serial.print("Connecting to "); |
|
Serial.println(ssid); |
|
|
|
WiFi.begin(ssid, password); |
|
|
|
while (WiFi.status() != WL_CONNECTED) { |
|
delay(500); |
|
Serial.print("."); |
|
} |
|
|
|
Serial.println(""); |
|
Serial.println("WiFi connected"); |
|
Serial.println("IP address: "); |
|
Serial.println(WiFi.localIP()); |
|
|
|
ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV |
|
ads.begin(); |
|
} |
|
|
|
void loop() { |
|
|
|
|
|
//Serial.print("Differential: "); Serial.print(results); Serial.print("("); Serial.print(trans_volt); Serial.println("mV)"); |
|
double current = calcIrms(2048); |
|
|
|
if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com |
|
String postStr = apiKey; |
|
postStr +="&field1="; |
|
postStr += String(current); |
|
postStr += "\r\n\r\n"; |
|
|
|
client.print("POST /update HTTP/1.1\n"); |
|
client.print("Host: api.thingspeak.com\n"); |
|
client.print("Connection: close\n"); |
|
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); |
|
client.print("Content-Type: application/x-www-form-urlencoded\n"); |
|
client.print("Content-Length: "); |
|
client.print(postStr.length()); |
|
client.print("\n\n"); |
|
client.print(postStr); |
|
} |
|
client.stop(); |
|
|
|
//Serial.println("Waiting..."); |
|
// thingspeak needs minimum 15 sec delay between updates |
|
delay(20000); |
|
} |