Hallo allerseits,
da ich Probleme mit dem Relais-Board hatte, bin ich nun auf den Motorcontroller MC33926 umgestiegen.
Nun stellt sich mir die Frage, kann ich meinen Sketch 1 zu 1 über nehmen oder wasmuss ich verändern ?
Vielen Dank für Eure Hilfe.
Edit: Sketch vergessen...
Hier nun der Sketch
/*######################################################
# #
# SolarTracker mit S0 Zähler #
# Version 0.8 #
# #
# Sonnenfolger, der mittels LDR immer #
# den hellsten Punkt am Himmel sucht #
# #
# written from Stefan Blinkmann #
# 01.04.2014 - 20:53 #
# #
########################################################*/
//#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
byte bell[8] = { B00100, B01110, B01110, B01110, B11111, B00000, B00100, B00000 };
byte sun[8] = { B00100, B10101, B01110, B11111, B01110, B10101, B00100, B00000 };
byte smili[8] = { B00000, B01010, B01010, B00000, B00100, B10001, B01110, B00000 };
byte left[8] = { B00010, B00110, B01110, B11110, B01110, B00110, B00010, B00000 };
byte right[8] = { B01000, B01100, B01110, B01111, B01110, B01100, B01000, B00000 };
byte ae[8] = { B01010, B00000, B01110, B00001, B01111, B10001, B01111, B00000 };
volatile int impState = 0;
volatile int lastimpState = 0;
int bounceTime = 100;
unsigned long act_imp;
unsigned long last_imp;
double impCounter = 0;
unsigned long millisBetween;
unsigned long lastMillis;
unsigned long watt;
double kwh = 0.000; // Kilowattstunden
double Preis = 0.2622; // Preis einer Kilowattstunde in Euro
double euro;
char tmp1[16];
char tmp2[16];
/*--- Solar Tracker ---*/
int moveleft = 4; // Motor pin left
int moveright = 5; // Motor pin right
int ldrleft = 1; // Name und Pin-Nr (LDR links)
int ldrcenter = 2; // Name und Pin-Nr (LDR mitte)
int ldrright = 3; // Name und Pin-Nr (LDR rechts)
int LDR_hell = 0; // Wert von LDR_hell
unsigned long Zeit_dtime; // Zeit-Variable für dtime
unsigned long pauseMillis; // Zeit-Variable für pause
/*--- Solar Tracker ---*/
void setup ()
{
Serial.begin(9600);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
pinMode(7, OUTPUT); // LCD Hintergrundbeleuchtung
pinMode(moveleft, OUTPUT); // Motor left als Ausgang deklarieren
pinMode(moveright, OUTPUT); // Motor right als Ausgang deklarieren
digitalWrite(moveleft, HIGH);
digitalWrite(moveright,HIGH);
lcd.init();
lcd.backlight();
lcd.createChar(0, bell); // Sonderzeichen Glocke
lcd.createChar(1, sun); // Sonderzeichen Sonne
lcd.createChar(2, smili); // Sonderzeichen Smiley
lcd.createChar(3, left); // Sonderzeichen left arrow
lcd.createChar(4, right); // Sonderzeichen right arrow
lcd.createChar(5, ae); // Sonderzeichen right arrow
digitalWrite(7, HIGH); // LCD Hintergrundbeleuchtung AN
lcd.setCursor(0,0);
lcd.write(1); // Sonne links
lcd.setCursor(2,0);
lcd.print(F("Starte Solar"));
lcd.setCursor(15,0);
lcd.write(1); // Sonne rechts
lcd.setCursor(3,1);
lcd.print(F("Z"));
lcd.write(5);
lcd.print(F("hler ..."));
delay(5000);
lcd.clear();
millisBetween = 0;
lastMillis = 0;
lastimpState = 0;
watt = 0;
Zeit_dtime = 0;
pauseMillis = 0;
}
void loop ()
{
impState = digitalRead(2);
act_imp = millis();
unsigned long time = millis();
if(act_imp - last_imp > bounceTime)
{
if (impState != lastimpState) {
if (impState == LOW) {
last_imp = act_imp;
impCounter++;
millisBetween = time-lastMillis;
lastMillis = time;
}
}
lastimpState = impState;
}
/*--- Solar Tracker ---*/
int left = analogRead(ldrleft); // LDR links einlesen
int right = analogRead(ldrright); // LDR rechts einlesen
int center = analogRead(ldrcenter); // LDR mitte einlesen
int rightN = right +20; // (-12 )LDR rechts an den linken angleichen, bei +47 sind L u. R vom Wert her gleich
int dtime = 1000; // Such/Beweg geschwindigkeit
int tol = 2; // (28) tolleranz zwischen LDR-links und LDR-rechts
unsigned long pause = 120000; // 2 min Pause in milliSek , wenn Links und Rechts gleich sind
int alr = (left + rightN) / 2; // durchschnitt LDR-links u. LDR-rechts
int LDR_hell = center; // LDR-mitte auch als LDR_hell deklarieren, für Nacht/Tag modus
int dhoriz = alr - center; // check the diffirence of left/rigt and center
int LR = left - rightN;
display_Counter();
digitalWrite(7, HIGH); // LCD Hintergrundbeleuchtung AN
if((millis() - pauseMillis) > pause){ // Pause wenn L&R gleich sind
if((millis() - Zeit_dtime) > dtime){ // Such/Beweg geschwindigkeit
Zeit_dtime = millis();
Serial.print(F("L:"));
Serial.println(left);
Serial.print(F("C:"));
Serial.println(center);
Serial.print(F("R:"));
Serial.println(rightN);
if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (left < rightN) // ist links kleiner als rechts, fahre nach links
{
//Serial.println(F("Move -->"));
digitalWrite(moveright, HIGH); // einzelne schritte -
digitalWrite(moveleft, LOW);
lcd.setCursor(14,1);
lcd.write(4);
}
else if (left > rightN) // ist links größer als rechts, fahre nach rechts
{
//Serial.println(F("<-- Move"));
digitalWrite(moveleft, HIGH); // einzelne schritte +
digitalWrite(moveright, LOW);
lcd.setCursor(14,1);
lcd.write(3);
}
else if (left == rightN) // sind links u. rechts gleich, in dieser stellung für 30 sek. bleiben
{
pauseMillis = millis();
//Serial.println(F("Horizontal Optimal !"));
digitalWrite(moveleft, HIGH);
digitalWrite(moveright, HIGH);
lcd.setCursor(14,1);
lcd.write(2);
}
}
if (left != rightN) { /* nix */ } // sind links und rechts ungleich, weiter suchen...
} /* Such/Beweg geschwindigkeit ende */
} /* Pause wenn L&R gleich sind ende */
}/*--- Loop Ende ---*/
void display_Counter(){
kwh = impCounter / 1000;
dtostrf(kwh, 1, 3, tmp1);
lcd.setCursor(0,0);
lcd.print(tmp1);
lcd.print(F(" KWh"));
euro = kwh * Preis;
dtostrf(euro, 1, 3, tmp2);
lcd.setCursor(0, 1);
lcd.print(tmp2);
lcd.print(" EUR");
watt = 3600000 / millisBetween;
if (int(watt) > 500) { watt = 500; } // ist Watt grösser als 500 , zeige nur 500 an
lcd.setCursor(11,0);
if (int(watt) <= -1){ lcd.print(" "); watt = 0;} // ist Watt kleiner oder gleich -1, setze watt auf 0
else if (int(watt) < 100 ) { lcd.print(' '); } //stellt ein leeres Feld voran, wenn Watt kleiner als 100
else if(int(watt) < 10 ) { lcd.print(' '); } //stellt zwei leere Felder voran, wenn Watt kleiner als 10
lcd.print(int(watt));
lcd.setCursor(15, 0);
lcd.print("W");
}
