Jade Perreault
Published

Outdoor Solar, Voltage and Light Sensing

Building a "Solar Power measuring Junction Box" with solar charging a 12 VDC Battery light sensing and Temperature Sensing going to MQTT.

AdvancedWork in progress4 hours1,484
Outdoor Solar, Voltage and Light Sensing

Things used in this project

Hardware components

Photon
Particle Photon
×1
Junction Box
Any Weatherproof Junction Box Will Do
×1
Particle Screw Shield
×1
DrokLM2596 Power converter
×1

Software apps and online services

OpenHab
Mosquitto

Hand tools and fabrication machines

M5 Drill Tap
OpenBuilds M5 Drill Tap

Story

Read more

Custom parts and enclosures

Junction Box with Battery Compartment

I just used an old junction box with a batter compartment ..I also built and installed a 120 volt AC to 12 volt DC power converter and also installed with (Gorilla Two sided tape) a voltage converter to convert 12VDC to 5 VDC ..I also installed DIN Rail for clip in Connectors ..and of course a plexiglass back plane for mounting the Particle and particle screw Shield
Img 0181 yb91w3i8j5

Schematics

Basic Wiring

Voltage Input ,DHT22 Input Light Sensor Input
Power project bb uhjscucrg2

Code

Particle Code

C/C++
This Code is all Accessible on the Particle.io Web IDE
#include "MQTT/MQTT.h"
#include "Adafruit_DHT/Adafruit_DHT.h"

#include "ThingSpeak/ThingSpeak.h"
#include "application.h"

//**MQTT**//

void callback(char* topic, byte* payload, unsigned int length);
byte server[] = { 192,168,1,117 };
MQTT client(server, 1883, callback);

//**********//

float input_voltage = 0.0;
float temp = 0.0;

#define DHTPIN 5
#define DHTTYPE DHT22
const int ledPin1 = D6 ;
const int ledPin2 = D7 ;
const int ledPin3 = D3 ;
const int analogInPin1 = A0;
const int analogInPin2 = A1;
const int analogInPin3 = A2;

//*************//

int sensorValue = 0;
int outputValue = 0;

int sensorValue2 = 0;
int outputValue2 = 0;

int sensorValue3 = 0;
int sensorValue4 = 0;

//int sensorValue5 = 0;
//int sensorValue6 = 0;

//int sensorValue7 = 0;
//int sensorValue8 = 0;

int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;

unsigned long previousMillis = 0;

DHT dht(DHTPIN, DHTTYPE);

/* Thingspeak */

//TCPClient client;
//unsigned long myChannelNumber = 207753;
//const char * myWriteAPIKey = "OMQ9B2I3MPS1H604";

//************//

void callback(char* topic, byte* payload, unsigned int length) {
    char p[length + 1];
    memcpy(p, payload, length);
    p[length] = NULL;
    String message(p);

    if (message.equals("RED"))    
        RGB.color(255, 0, 0);
    else if (message.equals("GREEN"))    
        RGB.color(0, 255, 0);
    else if (message.equals("BLUE"))    
        RGB.color(0, 0, 255);
    else    
        RGB.color(255, 255, 255);
    delay(1000);
}

//**LCD Setup**//





//****//


void setup() {
    
    Serial.begin(9600);
    
    //**MQTT//

    client.connect("OPENHAB Client");

    if (client.isConnected()) {
        client.publish("/outTopic","hello world");
        client.subscribe("/inTopic");
    }
    
    //**LED's**//
    
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    
    //**LCD**//
    
    
    //**DHT**//
    
    Serial.println("DHTxx test!");
    dht.begin();


}

void loop() {
    
    //***//
    
char message[56];
    
    //***Voltage Sensor***//
 {   
    int analog_value = analogRead(A0);
    input_voltage = (analog_value * 3.3) / 4095;

    Serial.print("V=");
    Serial.print(input_voltage);
    delay(10000);

 //**MQTT SEND VALUES//
 
    sprintf(message, " %d " , input_voltage );
    client.publish("mymosquitto/Particle2/VoltageLVL", message);
    String data = String (10);
    Particle.publish("Voltage Level", message, PUBLIC);
    delay(10000);
    
     if (sensorValue < 12) {
        digitalWrite (ledPin2, HIGH);
        digitalWrite (ledPin1, LOW);
        Particle.publish("Voltage HIGH", PUBLIC);


        delay(10000);
    }
    else if (sensorValue > 10) {
        digitalWrite (ledPin1, HIGH);
        digitalWrite (ledPin2, LOW);
        Particle.publish( "Voltage LOW", PUBLIC);

        delay(10000);
    }
    
 }

    //******************//
    
    if (client.isConnected())
        client.loop();
        
     {   //**MQTT SEND VALUES//
        
    int analog_value = analogRead(A1);
    input_voltage = (analog_value * 3.3) / 4095;

    sensorValue2 = analogRead(analogInPin2);
    outputValue2 = map(sensorValue, 0, 4095, 0, 255);
    Serial.println(sensorValue2);
    sprintf(message, " %d ", sensorValue2);
    client.publish("mymosquitto/Particle2/LightLVL", message);
    Particle.publish("Light Level", message, PUBLIC);
}
    //******************//    
    
     if (sensorValue2 < 1400) {

        Particle.publish( "Light levels low");


        delay(10000);
    }
    
    else if (sensorValue2 > 1400) {

        Particle.publish("Light Levels High");

        delay(10000);
    }
   

    if (client.isConnected())
    Serial.println("connected");
        client.loop();
        
        
        //**DHT**//

	float h = dht.getHumidity();
// Read temperature as Celsius
	float t = dht.getTempCelcius();
// Read temperature as Farenheit
	float f = dht.getTempFarenheit();
  
// Check if any reads failed and exit early (to try again).
	if (isnan(h) || isnan(t) || isnan(f)) {
		Serial.println("Failed to read from DHT sensor!");
		return;
	}

// Compute heat index
// Must send in temp in Fahrenheit!
	float hi = dht.getHeatIndex();
	float dp = dht.getDewPoint();
	float k = dht.getTempKelvin();

	Serial.print("Humid: "); 
	Serial.print(h);
	Serial.print("% - ");
	Serial.print("Temp: "); 
	Serial.print(t);
	Serial.print("*C ");
	
	delay(10000);
	
//**MQTT SEND VALUES//	
	sensorValue3 = (t);
	sprintf(message, " %d ", sensorValue3);
	Particle.publish("OutDoor Temperature", message, PRIVATE);
	client.publish("mymosquitto/Particle2/Temp", message);
	sensorValue4 = (h);
	sprintf(message, " %d ", sensorValue4);
	Particle.publish("OutDoor Humididty" , message ,PRIVATE);
	client.publish("mymosquitto/Particle2/Hum", message);
	
	delay(10000);
	//*****//
	
	Serial.println(Time.timeStr());
	delay(10000);

}

Openhab Code(Linux)

Liquid
Various code snippets from Openhab.org if you copy and past it should work for you ..If not I can walk you through it ..You can also check out http://www.homeautomationforgeeks.com
Linux Programming From LX Terminal

Sitemap File

Text label="Outdoor Junction Box" icon="shield-1" {
Text item=OutdoorTemp
Text item=OutdoorHum
Text item=Light Period=W

Items File

//Groups
MyHome (All)

//MQTT//

//My House
Number OutdoorTemp "Outdoor Temperature[%.2f C]" <temperature> (MyHouse)  {mqtt="<[mymosquitto:mymosquitto/Particle2/Temp:state:default]"}

Number OutdoorHum "Outdoor Humidity[%.2f %%]" <water> (MyHouse) {mqtt="<[mymosquitto:mymosquitto/Particle2/Hum:state:default]"}
Number Battery "Battery Level[%.2f VDC]" <solarplant> (MyHouse) {mqtt="<[mymosquitto:mymosquitto/Particle2/VoltageLVL:state:default]"}
Number Light "Sun Light[%.2f %%]" <sun_clouds> (MyHouse) {mqtt="<[mymosquitto:mymosquitto/Particle2/LightLVL:state:default]"}


OpenHAB.cfg file
#r connections here for use in the MQTT Binding or MQTTPersistence bundles. Replace <broker> with a id you choose.e MQTT broker, e.g. tcp://localhost:1883 or ssl://localhost:8883

mqtt:mymosquitto.url=tcp://localhost:1883

Particle Code (Thingsspeak)

C/C++
Particle.io IDE Code
// This #include statement was automatically added by the Particle IDE.
#include "Adafruit_DHT/Adafruit_DHT.h"
#include "ThingSpeak/ThingSpeak.h"
#include "Adafruit_DHT/Adafruit_DHT.h"
TCPClient client;
//**********//

float input_voltage = 0.0;
float temp = 0.0;

#define DHTPIN 0
#define DHTTYPE DHT22
const int ledPin1 = D6 ;
const int ledPin2 = D7 ;
const int ledPin3 = D3 ;
const int analogInPin1 = A0;
const int analogInPin2 = A1;
const int analogInPin3 = A2;

//*************//

int sensorValue = 0;
int outputValue = 0;

int sensorValue1 = 0;
int outputValue1 = 0;

int sensorValue3 = 0;
int sensorValue4 = 0;

//int sensorValue5 = 0;
//int sensorValue6 = 0;

//int sensorValue7 = 0;
//int sensorValue8 = 0;

int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;

unsigned long previousMillis = 0;

DHT dht(DHTPIN, DHTTYPE);

unsigned long myChannelNumber = YOUR CHANNEL NUMBER HERE;
const char * myWriteAPIKey = "YOUR APIKEY HERE";

void setup() {
    
        //**LED's**//
    
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    
    //**LCD**//
    analogRead(A0);
    
    //**DHT**//
    ThingSpeak.begin(client);
    dht.begin();
    


    // Give time for the message to reach ThingSpeak
    delay(5000);

}

void loop() {
    
    char message[56];
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a 
// very slow sensor)
	float h = dht.getHumidity();
// Read temperature as Celsius
	float t = dht.getTempCelcius();
// Read temperature as Farenheit
	float f = dht.getTempFarenheit();
  
// Check if any reads failed and exit early (to try again).
	if (isnan(h) || isnan(t) || isnan(f)) {
		Serial.println("Failed to read from DHT sensor!");
		return;
}

// Compute heat index
// Must send in temp in Fahrenheit!
	float hi = dht.getHeatIndex();
	float dp = dht.getDewPoint();
	float k = dht.getTempKelvin();
  Serial.println();
	Serial.print("Humid: "); 
	Serial.print(h);
	Serial.print("% ");
	Serial.println();
	Serial.print("Temp: "); 
	Serial.print(t);
	Serial.print("*C ");

	
sensorValue3 = (t);
sprintf(message, " %d ", sensorValue3);
Particle.publish("Temperature", message, PRIVATE);
sensorValue4 = (h);
sprintf(message, " %d ", sensorValue4);
Particle.publish("Humidity", message, PRIVATE);

    
   // Read Sensor
    double temperature = dht.getTempCelcius();
    double humidity = dht.getHumidity();

    // Update the 2 ThingSpeak fields with the new data
    
    ThingSpeak.setField(1, (float)temperature);
    ThingSpeak.setField(2, (float)humidity);  
    

  //**************//
  float pinVoltage = analogRead(A0) * (3.3 / 4095.0);
  ThingSpeak.setField(3,pinVoltage*100);
  pinVoltage = analogRead(A1) * (3.3 / 4095.0);
  ThingSpeak.setField(4,pinVoltage*11);
  pinVoltage = analogRead(A2) * (3.3 / 4095.0);
//  ThingSpeak.setField(3,pinVoltage);
//  pinVoltage = digitalRead(D0) * (3.3 / 4095.0);
//  ThingSpeak.setField(4,pinVoltage);
//  pinVoltage = digitalRead(D0) * (3.3 / 4095.0);
//  ThingSpeak.setField(5,pinVoltage);
//  pinVoltage = analogRead(A5) * (3.3 / 4095.0);
//  ThingSpeak.setField(6,pinVoltage);
//  pinVoltage = analogRead(A6) * (3.3 / 4095.0);
//  ThingSpeak.setField(7,pinVoltage);
//  pinVoltage = analogRead(A7) * (3.3 / 4095.0);
//  ThingSpeak.setField(8,pinVoltage);
  //*************//
  
   delay(20000);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);  
  
}

Credits

Jade Perreault

Jade Perreault

5 projects • 10 followers
Programming Newbie learning c++ and linux as a complicated hobby
Contact

Comments

Add projectSign up / Login