Solar-Nachführung

Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

woancade hat geschrieben: Sa 8. Jul 2023, 09:11 Was ich NICHT verstehe: Ihr habt doch nur eine horizontale Drehung?. Was bedeutet Motor 1 und Motor 2 ??????
Mit dem Motortreiber wird doch rechts und linkslauf gesteuert.
Ich schaue mal nocmal die Schaltung vom Max an. Aber ich denke das war nur die Laufrichtung des Motors. Motor 1 und Motor 2, wie rwechts und links rum.
woancade hat geschrieben: Sa 8. Jul 2023, 09:11 Wenn es Dir keine Mühe macht, könntest Du ein Fritzingbild von der Schaltung hochladen? Habe ein Arduino Nano, ein L298N Modul und ein RTC DS3231 Modul. Aber wie muß ich das verdrahten?
Ein Fritzing habe ich davon nicht. Ich mache auch nichts mit Fritzing. Aber ich könnte mal die Schaltung von Max umsetzen in die Art Schaltung, die ich für die Leser mache. Die sind allgemein verständlich, weil die orginal Abbildungen von den ganzen Bauteilen mit Orginal Anschlusspunkten zu sehen sind. Mache ich heute oder morgen mal. Wir kriegen heute noch viel Besuch zur Grillparty. Danach habe ich wieder mehr Luft.

Schöne Grüße, aus den heute seeeeehr warmen Ohlstadt
Franz
woancade
Beiträge: 22
Registriert: Fr 7. Jul 2023, 07:49
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von woancade »

Du bist mein Held :-)
Guten Hunger, bis dann.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

Ich habe jetzt mal einen ersten Plan. Aber der passt noch nicht, weil es so nicht funktionieren kann.
Aber ich habe das Ding von Max nicht hier. Deshalb kann ich nicht schauen was da falsch ist :sad:
Max müßte eigentlich Nachrichten bekommen, wenn sich im Thema was tut. Ich hoff er rührt sich noch. Aber ich schaue später mal das Programm von ihm an, da sollte ich eigentlich dann den mir fehlenden Pin finden.

Am Motortreiber müßen ja "IN1" bis "IN4" beschalten sein. In 1+2 sind für Motor 1, in 3+4 sind für Motor 2. Max hat beide Endstufen zusammen genommen, weil der Treiber zu schwach ist für den Motor. Aber ich kann ohne INT3 die zweite Endstufe nicht treiben. Deshalb kann das so nicht stimmen. Ich habe den Schaltplan wieder entfernt. Der war Unsinn. Max hat einen Chip verwendet, nicht das komplette Modul. Das ist aber wieder für Leute, denen Elektrotechnik & Elektronik fremd ist, zu umständlich aufzubauen. Deshalb habe ich da eine kleine Änderung gemacht, die das wesentlich vereinfacht.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

So jetzt habe ich den Plan geändert. Mit dem Treiber den ich dafür benutzen würde. Das Netzteil kann natürlich mehr Ampere haben, wenn der Motor mehr braucht!! Das DC/DC Modul, macht aus dem 12 Volt die benötigen 5 Volt für die ganzen anderen Teile der Steuerung. Der DS18B20 Sensor wird bei der Software von Max nicht angesprochen und ist bei dem Treiber den ich hier benutze auch nicht benötigt. Achtung, alles was mit 12 Volt arbeitet, braucht deutlich mehr Strom, also auch entsprechend dickere Drähte!! Deshalb sind die auch etwas dicker gezeichnet.
.
Sonnen_Nachführung_Max_V02.JPG
Sonnen_Nachführung_Max_V02.JPG (419.82 KiB) 277 mal betrachtet
woancade
Beiträge: 22
Registriert: Fr 7. Jul 2023, 07:49
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von woancade »

Guten Morgen Franz.
Na, lecker gegrillt?

OK. Das schaut ja nicht so kompliziert aus, bekomme ich hin. Ich lasse den Temperaturwächter weg, belasse das rote Kabel für den Endschalter.
Muss der offen oder geschlossen sein?
Welche Funktion hat das Modul oben neben dem Netzteil? Und wie ist die Bezeichnung?
Kann ich den letzten aktuellen Sketch verwenden? (von Max » Do 5. Jan 2023, 16:18). Da müssen doch bestimmt Änderungen vorgenommen werden!?

Einen schönen Sonntag und LG aus Quolsdorf.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

Ja, hat geschmeckt. :(V): War ein langer Abend. :hng:

Ja, R1 mit 4,7k kann weg, der ist für die Datenleitung des DS18B20, und der DS18B20 auch weg.
Das Ding oben Links ist der Spannungsregler (DC/DC Regler), der aus Spannungen bis 32 Volt die eingestellte Spannung macht. In dem Fall stellt man 5 Volt ein, so dass man aus 12 Volt, 5 Volt macht. Ich stelle immer 5,1-5,2 Volt ein. Achtung erst den Regler einstellen, bevor man da was dran anschließt, weil die immer auf eine höhere Spannung eingestellt sind!! Das heißt, wenn du die Schaltung zusammen baust, und die Spannung drauf gibst, ist der ganze 5 Volt Teil im Eimer, weil du die 5 Volt nicht vorher eingestellt hast. :(o): :(o):
Der Endschalter ist ein Schließer. Also in Ruhe offen.

Ja, der letzte aktuelle Code sollte passen.

Danke, dir auch einen schönen Sonntag :(V):
woancade
Beiträge: 22
Registriert: Fr 7. Jul 2023, 07:49
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von woancade »

Perfekt, da fange ich mal an! Werde berichten.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

Ich habe hier mal eine kleine Änderung gemacht, mit der man das Tempo des Motors einstellen kann. So wie es ist sollte es genau das selbe machen, wie das von Max. Man kann hier nur oben bei "int tempo = 255;" auch was anderes einstellen. z.B. 100. Nur 255 ist maximal. Schneller geht nicht. Wenn man da mehr eingibt, kommt undefinierter Mist raus. Und wie weit man runter kann, muss man testen. Ich denke zwischen 50 und 100 liegt das Minnimum. Ja und Maximum wie schon gesagt ist 255 !!

Code: Alles auswählen

// Programm zur Solarsteuerung mit DS 3231 Modul
#include "RTClib.h"
RTC_DS3231 rtc;
int mot1 = 5;        // Motor Rechts
int mot2 = 6;        // Motor Links
int schalter = 4;    // Endschater
int pwm = 9;
int tempo = 255;
unsigned long aktuellezeit = 0;
// ------millis Deklaration 01 -----------------------
unsigned long pausestartzeit01 = 0; // Eine Minute
const unsigned long pausezeit01 = 60000;

byte MotorR = 0;
byte MotorL = 0;
byte Ende = 0;
byte MotorStart = 0;
//----------------------------------------------------
void setup () {
  Serial.begin(9600);
  pinMode (mot1, OUTPUT);
  pinMode (mot2, OUTPUT);
  pinMode(schalter, INPUT_PULLUP);
  analogWrite(pwm, tempo);
#ifndef ESP8266
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif
  if (! rtc.begin()) {
    Serial.println("Konnte RTC nicht finden");
    Serial.flush();
    abort();
  }
  Serial.println("Setting the time...");
//  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
  DateTime now = rtc.now();
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  //    Serial.print(rtc.getTemperature());
  //    Serial.println(" C");
  Serial.println();
  Serial.println();

  if (now.hour() == 8 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 8 && now.minute() == 0 && now.second() == 14) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 9 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 9 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 10 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 10 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 11 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 11 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 12 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 12 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 13 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 13 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 14 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 14 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 15 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 15 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 16 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 16 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 17 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 17 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }

  if (now.hour() == 18 && now.minute() == 0 && now.second() == 0) {
    digitalWrite(mot1, HIGH); // zustellen
  }
  if (now.hour() == 18 && now.minute() == 0 && now.second() == 7) {
    digitalWrite(mot1, LOW); // Stopp
  }
  // Morgenstellung um 19 Uhr
  if (now.hour() == 19 && now.minute() == 0 && now.second() == 0) {
    if (MotorStart == 0)
    {
      MotorStart = 1;
    }
  }
  //---------------------------Aktuelle Millis übergeben-----------------------
  aktuellezeit = millis(); // Aktuelle Zeit für alle Millis Aktionen übergeben
  //---------------------------------------------------------------------------
  //---------------------------Motor Links Starten-----------------------------
  if (MotorStart == 1)
  {
    digitalWrite (mot2, HIGH);
    MotorL = 1;
    MotorStart = 2;
    pausestartzeit01 = aktuellezeit; // Eine Minute Abschaltung starten
  }
  //---------------------------------------------------------------------------
  //------------------------Endschalter Kontrolle------------------------------
  Ende = digitalRead(schalter);
  if (Ende == 0)
  {
    digitalWrite (mot2, LOW);
    MotorL = 0;
    digitalWrite (mot1, LOW);
    MotorR = 0;
  }
  //------------------60000 Aktion---------------------------------------------
  if ((aktuellezeit - pausestartzeit01 >= pausezeit01) && (MotorStart > 0)) // Eine Minute abgelaufen??
  {
    digitalWrite (mot1, LOW);
    MotorR = 0;
    digitalWrite (mot2, LOW);
    MotorL = 0;
    MotorStart = 0; // Eine Minute abgelaufen, startbereit für nächsten Rücklauf
  }
  //-----------------------------------------------------------------------------
 
}
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Bernhard - Fony »

Hallo,
sorry das ich hier so reinplatsche, habe mir paar Beiträge durchgelesen, mir ist aufgefallen das Ihr die Nachführung mit Lichtmessung und einer RTC macht. Das ist korrekt nur woher weist ihr wo zu zeit die Sonne steht bei bedecktem Himmel?
Ich wurde dazu nutzen den berechneten Sonnenaufgang plus Zeitkorrektur zum Standort = einmal schauen wann die Sonne „kommt“ auf Paneel, LDR oder ähnliches, danach zeitgesteuert das Modul drehen, Vorteil kommt die Sonne aus den Wolken Steht das Modul fast richtig.
Das Programm für Sonnen Auf und Untergang hat im Jahr 2012 @Jurs im Arduino CC Forum umgeschrieben für Arduino.
es at zwei Teile
Vorberechnung (vor Setup)
Berechnung in Loop

Damit diese Rechnung stimmt muss der Standort geändert werden (eingetragen ist mein Standort = Köln)
double B = 50.941278 * RAD; // geographische Breite
double GeographischeLaenge = 6.958281;
In dieser Zeile JD = JulianischesDatum(jahr, mon, tag, 12, 0, 0);
kann man direkt die Werte aus der RTC eintragen (jahr, mon, tag) die 12,0,0 bleit wie es ist.

Vorberechnung;

Code: Alles auswählen

//*****************************************************//
// C-Programm von http://lexikon.astronomie.info/zeitgleichung/neu.html
// umgeschrieben auf Arduino by 'jurs' for German Arduino forum
//****   angepasst an meine Bedürfnisse*****
//*******************************************************//
double pi2 = 6.283185307179586476925286766559;// ;)
double pi = 3.1415926535897932384626433832795;
double RAD = 0.017453292519943295769236907684886;

double JulianischesDatum ( int Jahr, int Monat, int Tag, int Stunde, int Minuten, double Sekunden )
// Gregorianischer Kalender
{
  int   Gregor;
  if (Monat <= 2)
  {
    Monat = Monat + 12;
    Jahr = Jahr - 1;
  }
  Gregor = (Jahr / 400) - (Jahr / 100) + (Jahr / 4); // Gregorianischer Kalender
  return 2400000.5 + 365.0 * Jahr - 679004.0 + Gregor
         + int(30.6001 * (Monat + 1)) + Tag + Stunde / 24.0
         + Minuten / 1440.0 + Sekunden / 86400.0;
}

double InPi(double z)
{
  int n = (int)(z / pi2);
  z = z - n * pi2;
  if (z < 0) z += pi2;
  return z;
}

double eps(double T) // Neigung der Erdachse
{
  return RAD * (23.43929111 + (-46.8150 * T - 0.00059 * T * T + 0.001813 * T * T * T) / 3600.0);
}
double BerechneZeitgleichung(double &DK, double T)
{

  double RA_Mittel = 18.71506921
                     + 2400.0513369 * T + (2.5862e-5 - 1.72e-9 * T) * T * T;

  double M  = InPi(pi2 * (0.993133 + 99.997361 * T));
  double L  = InPi(pi2 * (  0.7859453 + M / pi2
                            + (6893.0 * sin(M) + 72.0 * sin(2.0 * M) + 6191.2 * T) / 1296.0e3));
  double e = eps(T);
  double RA = atan(tan(L) * cos(e));
  if (RA < 0.0) RA += pi;
  if (L > pi) RA += pi;

  RA = 24.0 * RA / pi2;

  DK = asin(sin(e) * sin(L));

  // Damit 0<=RA_Mittel<24
  RA_Mittel = 24.0 * InPi(pi2 * RA_Mittel / 24.0) / pi2;

  double dRA = RA_Mittel - RA;
  if (dRA < -12.0) dRA += 24.0;
  if (dRA > 12.0) dRA -= 24.0;

  dRA = dRA * 1.0027379;
  return dRA ;
}
///**** Ende Sonnen auf/unter Vorberechnung

Der für die Berechnung :

Code: Alles auswählen

double JD2000 = 2451545.0;
          double JD;
          double JD1;  //**********Ales mit 1 am ende = gestern

          JD = JulianischesDatum(jahr, mon, tag, 12, 0, 0); // Heutiges Datum
          JD1 = JulianischesDatum(jahr, mon, tag - 1, 12, 0, 0); //******
          double T = (JD - JD2000) / 36525.0;
          double DK;
          double h = -50.0 / 60.0 * RAD;
          double B = 50.941278 * RAD; // geographische Breite
          double GeographischeLaenge = 6.958281;

          //double Zeitzone = 1; //Winterzeit
          double Zeitzone = 1.0;   //Sommerzeit 2

          double Zeitgleichung = BerechneZeitgleichung(DK, T);
          double Minuten = Zeitgleichung * 60.0;
          double Zeitdifferenz = 12.0 * acos((sin(h) - sin(B) * sin(DK)) / (cos(B) * cos(DK))) / pi;
          double AufgangOrtszeit = 12.0 - Zeitdifferenz - Zeitgleichung;
          double UntergangOrtszeit = 12.0 + Zeitdifferenz - Zeitgleichung;
          double AufgangWeltzeit = AufgangOrtszeit - GeographischeLaenge / 15.0;
          double UntergangWeltzeit = UntergangOrtszeit - GeographischeLaenge / 15.0;

          double Aufgang = AufgangWeltzeit + Zeitzone;         // In Stunden
          if (Aufgang < 0.0) Aufgang += 24.0;
          else if (Aufgang >= 24.0) Aufgang -= 24.0;

          double Untergang = UntergangWeltzeit + Zeitzone;
          if (Untergang < 0.0) Untergang += 24.0;
          else if (Untergang >= 24.0) Untergang -= 24.0;

          int aufgangMinuten   = int(60.0 * (Aufgang - (int)Aufgang) + 0.5);
          int aufgangStunden   = (int)Aufgang;
          if (aufgangMinuten >= 60.0) {
            aufgangMinuten -= 60.0;
            aufgangStunden++;
          }
          else if (aufgangMinuten < 0.0) {
            aufgangMinuten += 60.0; aufgangStunden--;
            if (aufgangStunden < 0.0) aufgangStunden += 24.0;
          }

          int untergangMinuten = int(60.0 * (Untergang - (int)Untergang) + 0.5);
          int untergangStunden = (int)Untergang;
          if (untergangMinuten >= 60.0) {
            untergangMinuten -= 60.0;
            untergangStunden++;
          }
          else if (untergangMinuten < 0) {
            untergangMinuten += 60.0; untergangStunden--;
            if (untergangStunden < 0.0) untergangStunden += 24.0;
          }

          byte laengeStunden = untergangStunden - aufgangStunden; //
          byte laengeMinuten = untergangMinuten -  aufgangMinuten;
Gruß Bernhard
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Solar-Nachführung

Beitrag von Admin »

Hallo Bernhard.
Das Programm von Max macht keine Lichtmessung und keine Richtungsbestimmung. Das dreht einfach nur von Morgens bis Abends in die Richtung, in der die Sonne in etwa stehen sollte. Jede Std. 7 Sekunden weiter. Um 19:00 Uhr fährt er zurück in die Morgen- Startstellung. Ich denke da fährt er in den Endschalter rein. dann ist er wieder Startbereit für en Tag, der wohl um 8:00 Uhr beginnt. Die Rückfahrt am Abend sollte wohl vom Endschalter gestoppt werden, wenn der Enschalter nicht funktioniert, dann ist wohl nach 60 Sekunden trotzdem spätestens die Rückfahrt beendet.

Franz
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 37 Gäste