solar Tracker Trolley

Solar Tracker på hjul

Solartracker er monteret på en sækkevogn af aluminium, hvilket gør man kan køre den derhen hvor energi behovet er .

Solar tracker er bygget med mange genbrugsdele, og en 100watt solcelle fra lukket firma indkøbt til spotpris.

Bruges b.la. ved hækklipning og græsslåning med batteridrevet el håndværktøjer. Også rigtig god når man står ude og makker med skruemaskiner, elkædesav osv.

En Solartracker er en maskine der med der med energi fra solcellen, følger solen fra øst til vest, gemmer energi i lithium ion batteri pakke, til senere brug via 230 volt inverter

Mekanik med aktuator monteret på aluminiums sækkevogn

Sækkevognen er forstærket med aluminiums profiler fra skrottede reoler.

Der er monteret en IP67 sikker LK boks, med 230 V AC inverter indeni og et blå CEE stik udenpå.

Nederst ses ekstra IP sikring af batteripakken, med an standard EUR klods kasse ovenpå.

Aktuator er fra en kasseret polarmount til parobol

Lithium Ion batteripakke i IP 66 sikkkert LK boks

Batteripakken består af maks. 5 pakker af hver 200watt, på 16.8Volt.

Batteripakkerne er sammensat af 4×6 standard 18650 LiIon celler, fra skrottede labtop batterier.

Hver pakke har egen BMS og koplet som 4s6p

Der er lavet en samlings print med standard XT60 stik, udgang fra batteripakken sker genmne et standard Anderson 50 Amp stik,

Arduino Uno med shield, strøm sensor og motor controller

Arduino uno er monteret med et shield med interconnection mellem switched, lysdioder, strømsensor og motordriver. (se kode til arduino her)

Strøm sensor sidde i serie med aktuator, og reagerer på for høj strøm, hvis den bremses undervandring af mennesker eller dyr, eller når yder position nåes, ved en evt. fejl på end switche

solar tracker i drift, under græsklipning og hækklipning med eltools

Solar Tracker Trolley C Sketch

#include <TimeLib.h> //https://github.com/PaulStoffregen/Time
#include <EEPROM.h>


// Suntracker addon with actuator, for solarTrolley
// open source suntracker project for higher performance solarpanels

// Arduino IDE 1.18 This version is a standalone version of the webbased solartracker
// You need to make some kind of data view mode trough serial/usb or embed some code for at display if you will used the polulo current chip data

// Author: http://techmind.dk michael pedersen
// Project home: http://techmind.dk/tag/suntracker/

// Start Date: 24. feb 2019
// License: coyright
// Version: 08b 
// Update: 01


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

//Define solartracker ports, valiables and static

//Digital ports
// 0 , 1 recerved for serial com
//const byte interruptPin = 2; // interrupt Data pin from actuator position encoder
const int motorController_IN3_OUT3 = 3; // HIGH = go WEST
const int motorController_IN4_OUT4 = 4; // HIGH = go EAST

//D in/out 5 NC/free
const int dipSwitchWest = 6;
const int ledAlive = 7;
const int dipSwitchEast = 8;
const int ledCheck = 9;


//Analog ports
int solarVoltSensor = 0;
//int free = 1;
int lightSensorEast = 2; //LDR
int lightSensorWest = 3; //LDR
int solarCurrentSensor = 4;
int actuatorCurrentSensor = 5;

//Variables
long lowCounter = 0;
int waitMinutesToNextTrackUpdate = 1; //This value is in minutes 1 equal one minut 5 eual 5 minuttes. In my application it is Set to 3 or 5 minutes
bool testModeSet = 0;
bool onWayHomeToWest = 0;  
bool east = 0;
bool west = 1;
bool acuatorCurrentExceeded; //1 = ok, 0 = overcurrent, Physical Limit, stop actuator

bool dipSwitchWestState = 0;
bool dipSwitchEastState = 0;

int optoPositionTheValue = 0;
int solarCurrentValue = 0;
int actuatorCurrentSensorValue; // Stop actuator +-15 from 520
int lightSensorEastValue;
int lightSensorWestValue;

int addrE2 = 0; //eeprom start adress
byte suntrackerPositionFromE2;

  
//volatile int state = LOW;      // The input state toggle

//Declare metodes

void goHomeWest(); //go all the way back to west start position

void goHomeEast(); //go all the way back to west start position
void goToWest();
void goToEast();
void stopActuator(); 
void testMode();

//********************
//Initialize and setup
//********************

void setup(){
  Serial.begin(9600);
  Serial.println("Hello world, i am suntracker and alive ;) ");
  
  //Initialize Solartracker ports and variables
  pinMode(ledAlive, OUTPUT);
  pinMode(ledCheck, OUTPUT);
  pinMode(dipSwitchWest, INPUT);
  pinMode(dipSwitchEast, INPUT);

  // Initialize Motor controller ports
  pinMode(motorController_IN3_OUT3, OUTPUT); // 
  pinMode(motorController_IN4_OUT4, OUTPUT);  // 
  
  // Initialize, make sure actuator is stopped
  stopActuator();
  
  digitalWrite(ledCheck, HIGH);
  
  //Attach the interrupt to the input pin and monitor for ANY Change
  //attachInterrupt(digitalPinToInterrupt(interruptPin), stateChange, CHANGE);
  
  //Set lowcounter
  time_t t = now(); // store the current time in time variable t 
  minute(t);        // returns the minute for the given time t 
  lowCounter =minute(t);

  // set test mode
  testModeSet = LOW; //set to HIGH to enter test mode
  onWayHomeToWest = LOW;

  blinkGreenLEDFast();
  digitalWrite(ledAlive, LOW);
  acuatorCurrentExceeded = HIGH;
}
          
//**********************************
// The loop where everything happens
//**********************************
void loop(){ //Main state maschine

      Serial.println(optoPositionTheValue);
  if (!testModeSet)
    { // Run normal  
      blinkGreenLEDSlow();
      Serial.println("Run mode");
      checkDualDipswitchPress(); // Enter testmode, press both endstop dipswitches at the same time  
      checkSuntrackerCurrentPosition();
      gotoNextSuntrackerPosition();
      time_t t = now();
    Serial.println(second(t));
                             
    }
    
    else
    
    { // Go into Testmode
      blinkRedLEDFast();
      Serial.println("Test mode");
      testMode();
      digitalWrite(ledAlive, LOW);
      checkDualDipswitchPress(); // Leave testmode, press both endstop dipswitches at the same time
    }
}

void gotoNextSuntrackerPosition()
  {
    // *** Start test light level east / west  
    lightSensorEastValue = analogRead(lightSensorEast);
    lightSensorWestValue  = analogRead(lightSensorWest);

    Serial.print(lightSensorEastValue);
    Serial.print(".....");
    Serial.println(lightSensorWestValue);

    checkActuatorPhysicalLimit();
    Serial.print(dipSwitchEastState);
    Serial.print(".....");
    Serial.println(dipSwitchWestState);

      
    //Check where to turn the suntracker to, to optain most light fotons
    if (lightSensorWestValue > lightSensorEastValue)
    {
      time_t t = now();
      if ((lowCounter+waitMinutesToNextTrackUpdate) == (minute(t)))
      {
           
              goToWest(); 
              Serial.println("Moving West");
                         
            
      }  
    }
    else if (lightSensorWestValue < lightSensorEastValue)
    {
      time_t t = now();
     if ((lowCounter+waitMinutesToNextTrackUpdate) == (minute(t)))
      {       
           
              goToEast();
              Serial.println("Moving east");
              
            
      }     
    }
    else if (lightSensorWestValue = lightSensorEastValue)
    {
      //LDR east and West equal, so stop actuator and copy minutes here and now til lowCounter, the wait offset data, not a counter, sorry
      stopActuator(); 
      time_t t = now();    
      lowCounter =minute(t);
    }
  }

void checkActuatorPhysicalLimit()
  {
    dipSwitchEastState = digitalRead(dipSwitchEast); // read dipswitch East 0 = pressed = end stop
    dipSwitchWestState = digitalRead(dipSwitchWest); // read dipswitch west 0 = pressed = end stop     
  }
  
void checkDualDipswitchPress() // Toggle testmode flag
  {
    
       // Both dipswitches pressed enter testmode
      dipSwitchEastState = digitalRead(dipSwitchEast); // read dipswitch west 0 = pressed = end stop  
        if (!dipSwitchEastState)
          {
            dipSwitchWestState = digitalRead(dipSwitchWest); // read dipswitch west 0 = pressed = end stop
            if (!dipSwitchWestState)
             {
                testModeSet = !testModeSet;          
             }
          }
  
  } 

  void goToWest()
{
  digitalWrite(ledCheck, HIGH);
  checkActuatorPhysicalLimit();
  actuatorCurrentCheck();

  if (acuatorCurrentExceeded)
    {
      if (dipSwitchWestState)
        {
          digitalWrite(motorController_IN3_OUT3, HIGH);  
          digitalWrite(motorController_IN4_OUT4, LOW);  
        }
        else
        {
          stopActuator();
        } 
      }
     
    else
    {
      stopActuator();
    }
}

void goToEast()
{
  checkActuatorPhysicalLimit();
  actuatorCurrentCheck();

  if (acuatorCurrentExceeded)
    {
      if (dipSwitchEastState)
        {
          digitalWrite(ledCheck, HIGH);
          digitalWrite(motorController_IN3_OUT3, LOW);  
          digitalWrite(motorController_IN4_OUT4, HIGH);    
        }
    
        else
        {
          stopActuator();
        }
    }
    else
    {
      stopActuator();
    }

    
}

void actuatorCurrentCheck()
{
  actuatorCurrentSensorValue = analogRead(actuatorCurrentSensor);
  Serial.println(actuatorCurrentSensorValue);
  
  if (actuatorCurrentSensorValue > 540)
    {
      acuatorCurrentExceeded = LOW;  
      Serial.println("acuator Current Exceeded!!");    
    }
        
   else if (actuatorCurrentSensorValue < 495)
    {
      acuatorCurrentExceeded = LOW;  
      Serial.println("acuator Current Exceeded!!");    
    }  
    
    
}

void stopActuator()
{
  digitalWrite(motorController_IN3_OUT3, LOW);  
  digitalWrite(motorController_IN4_OUT4, LOW);  
  digitalWrite(ledCheck, LOW);
}

void checkSuntrackerCurrentPosition()
  {
     suntrackerPositionFromE2 = EEPROM.read(addrE2);//write EEPROM.write(addr, val);
     //optoPositionThePhotoTransistor interrupt data pin in 
     //optoPositionTheValue
     
          
  }

void testMode()
{
 
 

  stopActuator();
  acuatorCurrentExceeded = HIGH;  
  

  
}
void blinkGreenLEDFast()
  {
     // Blink, Great solar tracker is alive
    digitalWrite(ledAlive, HIGH);
    delay(100);
    digitalWrite(ledAlive, LOW);
    delay(100);
   
  }

void blinkGreenLEDSlow()
  {
     // Blink, Great solar tracker is alive
    digitalWrite(ledAlive, HIGH);
    delay(300);
    digitalWrite(ledAlive, LOW);
    delay(300);
   
  }
  
void blinkRedLEDSlow()
  {
     // Blink, Great solar tracker is alive
    digitalWrite(ledCheck, HIGH);
    delay(300);
    digitalWrite(ledCheck, LOW);
    delay(300);
   
  }

void blinkRedLEDFast()
  {
     // Blink, Great solar tracker is alive
    digitalWrite(ledCheck, HIGH);
    delay(100);
    digitalWrite(ledCheck, LOW);
    delay(100);
    
  }

Solcelle lader til robot plæneklipper gardena

Ladestationen til gardena r40li robot klipper tager form.

Taget over gardena robot er lavet med 4 stk 10 watt solceller, der med en ældre pwm solar lader yder maks. 30 watt peak.

Det er fint til at komme igang med, og kan sagtens oplade den 435 watt store liion batteri bank.

Det anbefales dog klart at benytte mppt ladere, da de generelt har en noget højere effektivitet.

Solcelle tag er sat sammen og afstivet med elokserede aluminiums profiler

Gardena r40li ladestation med solceller

Ladestationen til gardena robot består overordnet af tre funktion:

  1. Sender et signal rundt i kant tråden for at fortælle robot hvor grænsen er
  2. Sender et andet signal via guide tråden, der får robotten til at vende hjem til opladning
  3. Forbinder robot med batteri opladeren
Ladestation til gardena r40li

Opladning foregår via DC adaptor md CV på 28 volt og CC på 1.2 Ampere

Med solceller, solcelle lader, lithium ion batteripakke og en CCCV Buck Converter, laves en solcelle oplader til Gardena r40li, så den kan slå græs helt autonomt og uafhængig af net tilslutning. En god Energi optimering af plæneklipning, der ellers klares med el fremstillet af fossile brændsler på et kraftværk, eller via forbrænding af benzin i en plæneklipper motor.

Mekanik skitse

I Sketchup er der blevet eksperimenteret med forskellige design ideer, og her ses det design der afprøves i praksis

Robot plæneklipper på solenergi

Gardena robot klipper i drift, med solceller og lithium ion batteribank

Denne Robotklipper klarer sig selv og kører på egen batteri bank, med el fra solceller.

Det er en fordel flere steder, med sol drevet robot græsslåning. Ofte er der ikke trukket en udendørs stikkontakt, til der hvor robottens ladestation kan placeres optimalt. Andre steder som i kolonihaver og i sommerhus områder, er der måske slet ikke mulighed for tilslutning til det etablerede el net.

En helt anden fordel ved eldrevet græs slåning er, hvorfor ikke lade robotten klare græsplænen selv og være 100% selvforsynende med energi til opgaven. En investeringen i en plæne klipper robot og / elle en batteri drevet plæneklipper, er forudbetalt græs slåning mange år frem. Ingen motor olie, igen benzin, ingen dyre karburator reparationer.

Gardena r40li robotten klarer at køre i regnvejr, og da robot med ladestation står ude i alt slags vejr, skal den solcelle opladede batteri bank kunne tåle miljøet og være sikker at bruge. Der skal bruges godkendte stik og kabler og alt skal være dokumenteret. Dermed er det faktisk muligt at lave sin egen CE mærkning, hvilket til sidst blot kræver udfyldelse af overensstemmelseserklæring, som svarer til den en producent skal

Det laves en tag til robotten med solceller på, en PWM solar lader og Lithium ion batteripakke med 18650 celler og en lader CV/CC lader til gardena r40li robot klipper.

Billedet herunder viser en IP67 sikret boks, med godkendte kabler og stik til solceller og forbrugere. Eneste der mangler på billedet er endeprop til det Grå Anderson stik.

Lithium Ion batteribank med solceller lader indbygget, alt i IP67 sikret box

Mål alt energi forbrug

En del af vejen til at forsyne sig selv med energi og dække basis behov, vil for de fleste betyde at man skal have lært noget om sit energi forbrug.

Energimåler med wife og google assistent, i en meget gammel stikkontakt.

Det gøres meget enkelt: Mål og registrer alt forbrug !

Det kan gøres meget billigt med en energi måler til Ca 100kr, eller der kan logges på de enkelte el forbrugere, og data sendes ud på nettet med smart enheder. Smart enheder kan også selv slukke når rummet forlades, og bruges sammen Google eller Alexia assistent. Samtidigt kan disse smart enheder bruges til tyverisikring og overvågning.

Herunder ses de i skyen gemte data, for tv hygget hjørnets elforbrug.

Start med de største og mest krævende forbrugere først:

  • Vaskemaskine
  • Opvaskemaskine
  • Tørretumbler
  • TV hyggehjørnet
  • Gamer pc’en
  • Fryser
  • Køleskab
  • WiFi router
  • Cirkulations pumpe
  • El Gulvvarme
  • Værksted
  • osv.

Næste trin er at udvælge den eller de forbrugere du kan spare på, feks overvej om opvasker skal køre hver dag, eller et par gange om ugen.

Solcelle lader med MPPT

cn3722 mppt lader

Mppt solcelle ladere med Chippen CN3722 kan findes overalt på ebay, banggood osv.

Den kan tilpasses ønsket batterispænding, fra 7.5 Volt til 28 Volt. og en ladestrøm på op til 5 Ampere.

CN3722 kan bruges som solcellelader til flere typer batterier, som LiIon, LiFePo4, LiPo, GEL osv.

Modstande R6 og R7 ændres, en formel findes i databladet fra consonance.

R6 og R7 er 1% SMD (EIA96) modstande. EIA96 modstands kalkulator

På R6 står 85D og R7 49D

R6 er på 75 K ohm

R7 er på 316 K ohm

Formlen for beregning af modstande til ønsket Batterispænding (CV):

VBAT=2.416×(1+R7/R6)+IB×R7

IB er 50nA

Dette print med CN3722 er beregnet til 12.61 volt batteri pakke: 3 stk LiIon 18650 i serie, det der kaldes 3s

Skal mppt solarladeren laves om til 4s LiIon, skal CV ændres til 16.6 VOlt

Lavede et regneark til at kalkulere modstandværdier til CN3722

Skal mppt cn3722 lader brus til 4s LiIon på 14.8 volt, lades til 16.6 Volt, R6 skal være 56Kohm og R7 330 Kohm