Bygga en Solar Powered ESP8266 (7 / 8 steg)
Steg 7: Arduino IDE källkoden för projektet
Källkoden för SolarPowerESP8266-projektet
Nedan finns källkoden för Arduino IDE ESP8266 pack. Att installera Arduino IDE ESP8266 pack kolla in detta inlägg.
Krävs bibliotek:
aREST.h - https://github.com/marcoschwartz/aREST
SunAirPlus INA3221 bibliotek - https://github.com/switchdoclabs/SDL_Arduino_INA3221
Kontrollera att du satt i egna värden för SSID och ditt lösenord för lokala åtkomstpunkten:
SolarPowerESP8266.ino
/*
SwitchDoc Labs koden för SolarPower ESP8266
Använder ESP8266 och SunAirPlus
Dedember 2015
*/
#pragma GCC diagnostik ignoreras "- Wwrite - strängar"
extern "C" {
#include "user_interface.h"
}
#include
#define DEBUG_MODE 1
#include
#include
SunAirPlus datastrukturer
Obs: SunAirPlus använder en 3 kanal ström/spänning I2C chip - INA3221 att läsa alla värden - se github.com/switchdoclabs/SDL_Arduino_INA3221
//
#include "SDL_Arduino_INA3221.h"
SAP INA3221
SDL_Arduino_INA3221 ina3221_SAP;
struktur för en SAP ina3221
struct SAPData
{
float busVoltage [3].
flyta ström [3].
float loadVoltage [3].
};
SAPData currentSAPData;
de tre kanalerna för den INA3221 heter för SunAirPlus Solar Power Controller kanaler (www.switchdoc.com)
#define SAP_LIPO_BATTERY_CHANNEL 0
#define SAP_SOLAR_CELL_CHANNEL 1
#define SAP_OUTPUT_CHANNEL 2
SAP buffert för att skicka värden till RaspberryPi
struct SAPBufferStruct
{
osignerade långa tidsstämpel;
SAPData SAPEntry;
};
#define SAPBUFFERSIZE 200
SAPBufferStruct SAPBuffer [SAPBUFFERSIZE];
int CurrentSAPBuffer;
int lastReadSAPBuffer;
#include "SAPData.h"
//----------------------------------------------------------------------
Lokala WiFi SunAirPlus
CONST char * ssid = "YOURSSID";
CONST char * lösenord = "YOURPASSWORD";
#define SOLARPOWERESP8266VERSION 004
//----------------------------------------------------------------------
int blinkPin = 0; PIN blinka ledde vid varje avläsning
Porten att lyssna för inkommande TCP-anslutningar
#define LISTEN_PORT 80
Skapa en instans av servern
WiFiServer server(LISTEN_PORT);
osignerade långa oldReadSunAirPlusTime;
osignerade långa newReadSunAirPlusDeltaTime;
int RestTimeStamp;
Sträng RestDataString;
Att skapa Avila instans
Avila resten = aREST();
Anpassad funktion tillgänglig av API
int ledControl (String kommando) {
Få tillstånd från kommandot
int state = command.toInt();
digitalWrite (0, statligt);
tillbaka 1.
}
void setup() {
pinMode (blinkPin, produktionen); PIN-kod som blinkar varje läsning
digitalWrite (blinkPin, hög); Hög av detta stift är LED av
Initiering av SAP
startSAPINA3221();
Serial.BEGIN(115200); Vi är överens om att prata snabbt!
Serial.println("---");
Serial.println ("SolarPower ESP8266");
Serial.println("---");
RestTimeStamp = 0;
RestDataString = "";
rest.Variable ("RestTimeStamp", & RestTimeStamp);
rest.Variable ("RestDataString", & RestDataString);
Funktion för att utsättas
rest.function ("led", ledControl);
Ge namn och ID till enhet
rest.set_id("1");
rest.set_name("SolarPowerESP8266");
Serial.Print ("ansluter till");
Serial.Print(SSID);
om (strcmp (WiFi.SSID().c_str(), ssid)! = 0) {
WiFi.begin (ssid, lösenord);
}
medan (WiFi.status()! = WL_CONNECTED) {
Delay(500);
Serial.Print(".");
}
Serial.println("");
Serial.Print ("lokala WiFi anslutna, IP-adress:");
Serial.println(WiFi.localIP());
Starta servern
Server.BEGIN();
Serial.println ("Server började");
oldReadSunAirPlusTime = micros();
initSAPBuffer();
}
int sampleCount = 0;
Loopa igenom läsa aktuella och solar prestanda
void loop() {
Hantera resten samtal
WiFiClient klient = server.available();
om (klient)
{
medan (! client.available()) {
Delay(1);
}
om (client.available())
{
Serial.Print ("buffertstorleken =");
Serial.println(returnCountSAPBuffer());
RestTimeStamp = millis();
printDebugFullSAPBuffer();
RestDataString = assembleSAPBuffer();
rest.handle(Client);
}
}
newReadSunAirPlusDeltaTime = micros() - oldReadSunAirPlusTime; Detta hanterar den 71 andra välta på grund av unsighned aritmetiska
om (newReadSunAirPlusDeltaTime > 1000000) / / kolla för 1 sekund arbete för att göra
{
Serial.Print ("gratis heap på ESP8266:");
Serial.println(ESP.getFreeHeap(), DEC);
digitalWrite (blinkPin, låg); Hög av detta stift är LED på
Serial.println();
readSAP();
writeSAPBuffer();
digitalWrite (blinkPin, hög); Hög av detta stift är LED av
oldReadSunAirPlusTime = micros();
printDebugFullSAPBuffer();
}
Yield(); ta en paus - du måste göra detta för att ESP8266 ska fungera i alla fall!
}
Filen SAPData.h
SAP buffert rutiner
void initSAPBuffer()
{
CurrentSAPBuffer = -1;
lastReadSAPBuffer = -1;
int i;
för (jag = 0; jag < SAPBUFFERSIZE; i ++) {SAPBuffer [i] .timeStamp = 0;}} void writeSAPBuffer() {//Serial.print ("post WriteSAPBuffer C/R"); Serial.Print(CurrentSAPBuffer); Serial.Print ("/"); Serial.println(lastReadSAPBuffer); CurrentSAPBuffer ++; om (CurrentSAPBuffer > = SAPBUFFERSIZE) / / Linda runt
{
CurrentSAPBuffer = 0;
}
SAPBuffer [CurrentSAPBuffer] .timeStamp = millis();
SAPBuffer [CurrentSAPBuffer]. SAPEntry = currentSAPData;
Serial.Print ("utgång WriteSAPBuffer C/R");
Serial.Print(CurrentSAPBuffer);
Serial.Print ("/");
Serial.println(lastReadSAPBuffer);
}
int returnCountSAPBuffer()
{
int i;
int count = 0;
för (jag = 0; jag < SAPBUFFERSIZE; i ++) {om (SAPBuffer [i] .timeStamp > 0)
greve ++;
}
returnera count;
}
int readSAPBuffer(SAPBufferStruct *mySAPBuffer)
{
Serial.Print ("inReadSAPBuffer C/R");
Serial.Print(CurrentSAPBuffer);
Serial.Print ("/");
Serial.println(lastReadSAPBuffer);
läsa upp alla data, ingen roll ordningen. SQL Databoase på Pi kommer att lista ut...
om (lastReadSAPBuffer == -1) / / ta itu med först läsa oavsett hur länge sedan
{
Skanna den buffert för minsta > 0 timeStamp - inställd lastReadSAPBuffer
int i;
int smallestTimeStamp = 4294967295; 2 ^ 32-1
int smallestIndex = 0;
för (jag = 0; jag < SAPBUFFERSIZE; i ++)
{
om (SAPBuffer [i] .timeStamp! = 0)
{
om (SAPBuffer [i] .timeStamp < smallestTimeStamp) {smallestTimeStamp = SAPBuffer [i] .timeStamp; smallestIndex = jag;}} } lastReadSAPBuffer = smallestIndex; } om (SAPBuffer [lastReadSAPBuffer] .timeStamp == 0) {return -1;} * mySAPBuffer = SAPBuffer [lastReadSAPBuffer]; SAPBuffer [lastReadSAPBuffer] .timeStamp = 0; lastReadSAPBuffer ++; om (lastReadSAPBuffer > = SAPBUFFERSIZE)
{
lastReadSAPBuffer = 0;
}
}
Sträng assembleSAPBuffer()
{
int status;
SAPBufferStruct mySAPBuffer;
Sträng returnString;
returnString = "";
returnString = String(ESP.getFreeHeap());
status = readSAPBuffer (& mySAPBuffer);
medan (status! = -1)
{
om (returnString.length()! = 0)
{
returnString += "|";
}
Sträng sensorBuild;
sensorBuild = String(mySAPBuffer.timeStamp) + ",";
int i;
för (jag = 0; jag < 3; i ++)
{
sensorBuild += sträng (mySAPBuffer.SAPEntry.busVoltage [I], 2) + ",";
sensorBuild += sträng (mySAPBuffer.SAPEntry.loadVoltage [I], 2) + ",";
om (jag < 2).
sensorBuild += sträng (mySAPBuffer.SAPEntry.current [I], 2) + ",";
annat
sensorBuild += sträng (mySAPBuffer.SAPEntry.current [I], 2);
Serial.Print("sensorBuild=");
Serial.println(sensorBuild);
}
returnString += sensorBuild;
status = readSAPBuffer (& mySAPBuffer);
}
återvända returnString;
}
void printDebugFullSAPBuffer()
{
Serial.Print ("DebugFullSAPBuffer statliga C/R");
Serial.Print(CurrentSAPBuffer);
Serial.Print ("/");
Serial.println(lastReadSAPBuffer);
int i;
för (jag = 0; jag < SAPBUFFERSIZE; i ++)
{
Serial.Print("index:");
Serial.Print(i);
Serial.Print ("timeStamp =");
Serial.Print(SAPBuffer[i].timeStamp);
om (SAPBuffer [i] .timeStamp == 0)
{
Serial.println ("SAPEntry = null");
}
annat
{
Serial.println ("SAPEntry = Full");
/*
SAPData currentSAPData;
currentSAPData = SAPBuffer [i]. SAPEntry;
Serial.println ("---SAP ENTRY---");
Serial.Print ("LIPO_Battery ström:"); Serial.Print(currentSAPData.Current[0]); Serial.println ("mA");
Serial.Print ("solcell buss spänning:"); Serial.Print(currentSAPData.busVoltage[1]); Serial.println ("V");
Serial.Print ("Output buss ström:"); Serial.Print(currentSAPData.Current[2]); Serial.println ("mA");
*/
}
}
}
Läsa data från specifika SunAirPlus enhet (SAP0 - SAP2)
void startSAPINA3221()
{
ina3221_SAP.BEGIN(); SAP
}
void readSAP()
{
int i;
för (jag = 0; jag < 3; i ++)
{
currentSAPData.busVoltage[i] = 0.0f;
currentSAPData.current[i] = 0.0f;
currentSAPData.loadVoltage[i] = 0.0f;
}
currentSAPData.busVoltage[0] = ina3221_SAP.getBusVoltage_V(SAP_LIPO_BATTERY_CHANNEL + 1);
currentSAPData.current[0] = ina3221_SAP.getCurrent_mA(SAP_LIPO_BATTERY_CHANNEL + 1); minus är att få den "känslan" rätt. -sätt batteriet laddas, + att det laddas
currentSAPData.loadVoltage[0] = currentSAPData.busVoltage[0] + (ina3221_SAP.getShuntVoltage_mV(SAP_LIPO_BATTERY_CHANNEL + 1) / 1000);
currentSAPData.busVoltage[1] = ina3221_SAP.getBusVoltage_V(SAP_SOLAR_CELL_CHANNEL + 1);
currentSAPData.current[1] = - ina3221_SAP.getCurrent_mA(SAP_SOLAR_CELL_CHANNEL + 1); minus är att få den "känslan" rätt. -sätt batteriet laddas, + att det laddas
currentSAPData.loadVoltage[1] = currentSAPData.busVoltage[1] + (ina3221_SAP.getShuntVoltage_mV(SAP_SOLAR_CELL_CHANNEL + 1) / 1000);
currentSAPData.busVoltage[2] = ina3221_SAP.getBusVoltage_V(SAP_OUTPUT_CHANNEL + 1);
currentSAPData.current[2] = ina3221_SAP.getCurrent_mA(SAP_OUTPUT_CHANNEL + 1); minus är att få den "känslan" rätt. -sätt batteriet laddas, + att det laddas
currentSAPData.loadVoltage[2] = currentSAPData.busVoltage[2] + (ina3221_SAP.getShuntVoltage_mV(SAP_OUTPUT_CHANNEL + 1) / 1000);
Serial.println ("---SAP Data---");
Serial.Print ("LIPO_Battery buss spänning:"); Serial.Print(currentSAPData.busVoltage[0]); Serial.println ("V");
Serial.Print ("LIPO_Battery Load Voltage:"); Serial.Print(currentSAPData.loadVoltage[0]); Serial.println ("V");
Serial.Print ("LIPO_Battery ström:"); Serial.Print(currentSAPData.Current[0]); Serial.println ("mA");
Serial.println("");
Serial.Print ("solcell buss spänning:"); Serial.Print(currentSAPData.busVoltage[1]); Serial.println ("V");
Serial.Print ("solcell belastning spänning:"); Serial.Print(currentSAPData.loadVoltage[1]); Serial.println ("V");
Serial.Print ("solcell ström:"); Serial.Print(currentSAPData.Current[1]); Serial.println ("mA");
Serial.println("");
Serial.Print ("buss buss utspänning:"); Serial.Print(currentSAPData.busVoltage[2]); Serial.println ("V");
Serial.Print ("buss belastning utspänning:"); Serial.Print(currentSAPData.loadVoltage[2]); Serial.println ("V");
Serial.Print ("Output buss ström:"); Serial.Print(currentSAPData.Current[2]); Serial.println ("mA");
Serial.println("");
Serial.println("---");
hemkomst.
}