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.
}

Se Steg
Relaterade Ämnen

Bygga en Solar Powered R/C bil

Detta är min nyligen avslutade Solar RC bil. Jag byggde denna bil för att väcka intresse i tävlar i sol-Race i sommaren 2009 i USA Detta projekt använt många av hylla hobby delar och kunde byggas av en R/C hobby med erfarenhet av kit byggnad och lödn...

Bygg detta Solar Powered hydroponiska vatten trädgård på hjul - måste läsa!

Build detta fantastiska solar driv, helt fristående hydroponiska trädgård och växa största blommorna, den godaste frukt och grönsaker som du kan faktiskt leva på året runt. Avsedda för utomhusbruk det kan lika gärna användas inomhus. Denna maskin kan...

Hur man bygger en Solar Powered Boombox

Målet med detta projekt var att skapa en högtalare som var energi oberoende och solar driv. Systemet var avsedd att vara ganska kompakt och portabel. Systemet kan användas i olika miljöer som i bergen, floderna, eller i en park. Högtalaren är gjord b...

Solar Powered Trike

resa gratis med kraften i solen!Hur man bygger en Solar Powered TrikeSyftet med detta projekt är att bygga ett fordon som:-Ger gratis, "gröna" transport för korta sträckor (< 10 miles), således måste det aldrigAnslut till ett vägguttag eller...

Billiga solar powered iPhone laddare

i detta Instructable, eleverna lära sig om grundläggande elektronik och förnybara energikällor genom att bygga en solar powered mobiltelefon laddare. Samtidigt som befintliga laddare kör från $70 - $90, kosta komponenter för detta projekt bara runt $...

Hur man gör en magnetisk monterbar solar minty ljus (solar powered ficklampa)

bygga en solar powered ficklampa i en Altoids tin för nästan ingenting. Innehåller hög effektivitet lysdioder. Helt själv drivs. Använder en solpanel, ett laddningsbart batteri, 5 extremt ljusa vita lysdioder och en Vippbrytare. Allt passar in i din...

Bygga ett växthus med Solar Powered Ventalation

Jag bor i solnedgången klimatzon 17 (San Francisco), så deras var mycket saker jag vill växa, men kunde inte på grund av klimatet. Min basilika var magra, min aubergine skrumpnade... Jag hade tur att få 2 eller 3 små tomater per planta. Jag velat ha...

Bygga din egen DIY solar powered mobiltelefon

detta Instructables beskriver i detalj hur man bygger en egen solar powered mobiltelefon.Linjär teknik artikel diskuterar solar laddning, med maximal effekt spårning - se utdraghttp://CDs.Linear.com/docs/lt%20Journal/LTMag-V19N4-04-LT3652-JimDrew.pdf...

Bygga ett växthus med solar powered ventilation

Jag bor i solnedgången klimatzon 17 (San Francisco), så deras var mycket saker jag vill växa, men kunde inte på grund av klimatet. Min basilika var magra, min aubergine skrumpnade... Jag hade tur att få 2 eller 3 små tomater per planta. Jag velat ha...

Solar Powered vertikala DROPP Hydroponics med franska smide Detaljer * uppdaterad! *

jag verkligen ville ha ett sätt att växa en betydande mängd råvaror utan att använda någon makt som krävs en plugg att göra det, och att det ser bra - mer som möbel som du vill ha inne i huset. Så byggde jag detta.Det finns en miljon olika sätt att k...

Automatiserad Solar Powered horisontella Blind Controller

Jag började detta projekt eftersom vi har några horisontella persienner ligger i ett högt fönster över ytterdörren till vårt hus. Fönstret vetter mot söder, och här i Colorado, det betyder massor av solsken. Det vore trevligt att ha att solljuset lys...

Hur man gör en Solar Powered Fan!

(''Hooray! Det är äntligen gjort. Det är lite sent in i tävlingen men vi hoppas det är bra!'' )Detta är vad vi anger för Go Green tävlingen. Det är en cool solar powered mini fan. Tanken är att om du hade en fläkt som du vill använda luftkonditioneri...

Hur man gör en Solar Powered gångväg

jag säker älskar mig några sun burkar! De innehåller flera av mina favorit saker att röra runt med: lysdioder, solpaneler, varmt lim, man det är alla där och de ser bra ut för start!Det finns dock ett stort fett problem: solen! När det är mörkt ute,...

Cykel Directional Lights - enkel, låg kostnad och Solar Powered

Jag använda min cykel för att pendla till arbetet, och under hösten säsongen gång jag befinner mig rida hem i mörkret. Medan min cykel är utrustad med varselljus (och jag med en reflekterande väst) är jag inte särskilt orolig för att bli sedd medan j...

Fristående Solar Powered alger odling

Detta instructable kommer att täcka hela sammanställningen av min resa efter att ha avslutat min prototyp DIY Standalone Solar Powered Algae Cultivation gjorda av en återvunnen 55 gallon pvc trumma. Jag kommer också att visa hur jag integrerat en sol...

Solar Powered Clock

konvertera en vanlig klocka till en som laddas genom sol. En ganska lätt bygga med valfria lödning och låga kostnader gör detta till ett bra grabb vänliga projekt. Min son och jag byggt en eftermiddag och han var imponerad av idén att enkelt återanvä...

Solar Powered Clock hacka

detta är en enkel hacka som gör att din räknare att arbeta på solenergi men det finns en twist i det vi inte kommer att använda solceller men vi kommer att använda lysdioder för att bygga en solcell. Lysdioder kan inte bara avger ljus men känsla ljus...

Göra en Solar Powered Fan

Välkommen till handledning om hur man gör en solar powered fan!Till att börja med behöver du:Grön vetenskap Solar Rover Kit (kan köpas från någon Michael's Art Store)Tillgängligheten till en 3D-skrivareTillgång till en dator (för del design)Power såg...

Solar powered pump för vatten fat

jag har detta postat på min blogg med bilder här:http://sistersplayinghouse.blogspot.com/2012/07/Solar-Powered-Water-Pump.htmlJag har äntligen hittat en chans att sitta ner och skriva detta - jag väntade på slangen hjul vagnen man får ställa också. S...