Skocz do zawartości

Sterowanie taśmą rgb(w) przy pomocy esp lub ardu mega.


SOYER

Pomocna odpowiedź

(edytowany)
1 godzinę temu, SOYER napisał:

W żadnej bibliotece nie widzę takiego info

Słabo patrzysz.

https://www.arduino.cc/reference/en/libraries/sunset/

Możesz oczywiście użyć Ephemeris, ale to straszna kobyła i pozycja Jowisza względem Saturna chyba Ci niepotrzebna 😉

Edytowano przez ethanak
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@SOYER ja robię tak (zakładając że maszyna działa non stop):

Jeśli potrzebny mu wschód/zachód sprawdzam, czy nie mam go już obliczonego (tzn. Czy zapamiętany numer dnia jest taki sam jak bieżący). Jeśli nie, obliczam i zapamiętuję. A numer dnia to unix_time/86400 po prostu.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

6 minut temu, ethanak napisał:

Jeśli potrzebny mu wschód/zachód sprawdzam, czy nie mam go już obliczonego (tzn. Czy zapamiętany numer dnia jest taki sam jak bieżący). Jeśli nie, obliczam i zapamiętuję. A numer dnia to unix_time/86400 po prostu.

@ethanak a Twoja metoda liczy ( uwzględnia ) też czas letni/zimowy 🤔 ?

Link do komentarza
Share on other sites

@ethanak wczoraj próbowałem użyć tego:

// Arduino Sunrise Library
// https://github.com/JChristensen/Sunrise
// Copyright (C) 2021 by Jack Christensen and licensed under
// GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Arduino Sunrise Library example sketch.
// Prints a listing of sunrise and sunset times for a given range of years.
// Jack Christensen 03Jan2021

#include <JC_Sunrise.h>     // https://github.com/JChristensen/JC_Sunrise
//#include <Streaming.h>      // https://github.com/janelia-arduino/Streaming
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time
#include <Timezone.h>       // https://github.com/JChristensen/Timezone

constexpr int startYear {2015}, endYear {2030};

// latitude & longitude for sunrise & sunset calculations
constexpr float myLat {45.8171}, myLon {-84.7278};

// timezone objects for US Eastern Time
TimeChangeRule EDT {"EDT", Second, Sun, Mar, 2, -240};  // daylight time = UTC - 4 hours
TimeChangeRule EST {"EST", First, Sun, Nov, 2, -300};   // standard time = UTC - 5 hours
Timezone Eastern(EDT, EST);
TimeChangeRule *tcr;

JC_Sunrise sun {myLat, myLon, JC_Sunrise::officialZenith};

void setup()
{
    delay(500);
    Serial.begin(9600);
 
    
    tmElements_t tm;
    tm.Year = CalendarYrToTm(startYear);
    tm.Month = 1;
    tm.Day = 1;
    tm.Hour = 12;
    tm.Minute = 0;
    tm.Second = 0;
    time_t utcNow = makeTime(tm);
    
    while (year(utcNow) < endYear + 1) {
        time_t locNow = Eastern.toLocal(utcNow, &tcr);  // tz adjustment
        time_t rise, set;
        sun.calculate(locNow, tcr->offset, rise, set);
        Serial.println("utc:");
        Serial.println(utcNow);
        delay(4000);
        Serial.println("loc:");
        Serial.println(locNow);
        delay(4000);
        Serial.println("rise");
        Serial.println(rise);
        delay(4000);
        Serial.println("sunset");
        Serial.println(set);
       delay(4000);
        utcNow += SECS_PER_DAY;
    }
}

void loop() {}

Jednak zwraca mi takie coś:

utc:
1420200000
loc:
1420182000
rise
1420186800
sunset
1420218360
utc:
1420286400
loc:
1420268400
rise
1420273200
sunset
1420304820
utc:
1420372800
loc:
1420354800
rise
1420359600
sunset
1420391280

Nie miałem pojęcia o co chodzi z tymi liczbami.

Możesz mi wtłuc do głowy co robi ten szkic, co mi wysyła i co z tym zrobić?

Link do komentarza
Share on other sites

19 minut temu, keram167 napisał:

a Twoja metoda liczy ( uwzględnia ) też czas letni/zimowy 

W UTC nie ma pojęcia "czas letni/zimowy". A przeliczenie z UTC na lokalny to raczej prosta sprawa.

9 minut temu, SOYER napisał:

Nie miałem pojęcia o co chodzi z tymi liczbami.

 

Liczba sekund od 1.01.1970 (epoch)

Link do komentarza
Share on other sites

No przecież masz w szkicu, podaje moment wschodu czy tam zachodu słońca (co tam liczysz) dla bieżącego dnia i konkretnej długości/szerokości geograficznej. A do przeliczenia z epoch na godziny/minuty jest fafnaździesiąt bibliotek...

Poza tym wcale nie musisz przeliczać, jeśli bieżący czas masz jako epoch to wystarczy proste porównanie (czas większy od sunrise i mniejszy od sunset to dzień)

 

Link do komentarza
Share on other sites

(edytowany)

@keram167 dziękuję, na Twojej bibliotece udało mi się to ogarnąć. Teraz mogę działać dalej.

Poniżej szkic, podstawa, odpalona SUPLA, pobieranie czasu z polskiego serwera NTP, wyświetlanie na Serialu aktualnej godziny wschodu i zachodu.

Teraz jeszcze poprawki, małe zmiany, ale jądro jest. Dziękuję chłopaki.

/////////////////////////////////////  192.168.4.1/update    //////////////////////////////
#include <SuplaDevice.h>
#include <supla/sensor/DS18B20.h>
#include <supla/control/relay.h>
#include <supla/control/button.h>
#include <supla/sensor/binary.h>
#include <supla/network/esp_wifi.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/events.h>
#include <supla/storage/eeprom.h>
#include <ESP8266HTTPUpdateServer.h>                     //OTA
#include <Timers.h>

Supla::Eeprom eeprom;
Supla::ESPWifi wifi;
ESP8266HTTPUpdateServer httpUpdater;        
#include <Ephemeris.h>
#include <NTPClient.h>
#include <Time.h>

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "tempus1.gum.gov.pl");
int currentHour;
int currentMinute;
int weekDay;
int monthDay;
int currentMonth;
int currentYear;

void printRiseAndSet(FLOAT latitude, FLOAT longitude, int UTCOffset, int day, int month, int year)
{
  Ephemeris::setLocationOnEarth(latitude,longitude);
           
  SolarSystemObject sun = Ephemeris::solarSystemObjectAtDateAndTime(Sun,
                                                                    day,month,year,
                                                                    0,0,0);

  if( sun.riseAndSetState == RiseAndSetOk )
  {
    int hoursR,minutesR,hoursS, minutesS;
    FLOAT seconds;

    Ephemeris::floatingHoursToHoursMinutesSeconds(Ephemeris::floatingHoursWithUTCOffset(sun.rise,UTCOffset), &hoursR, &minutesR, &seconds);
    Serial.print("  Wschod: ");
    Serial.print(hoursR);
    Serial.print("h");
    Serial.print(minutesR);
    Serial.print("m");

    Ephemeris::floatingHoursToHoursMinutesSeconds(Ephemeris::floatingHoursWithUTCOffset(sun.set,UTCOffset), &hoursS, &minutesS, &seconds);
    Serial.print("  Zachod:  ");
    Serial.print(hoursS);
    Serial.print("h");
    Serial.print(minutesS);
    Serial.print("m");
  }
  
  Serial.println();
}

Timer sekund10;

#define BUTTON_CFG_RELAY_GPIO D5       //D2
Supla::LittleFsConfig configSupla;
Supla::EspWebServer suplaServer;
Supla::Html::DeviceInfo htmlDeviceInfo(&SuplaDevice);
Supla::Html::WifiParameters htmlWifi;
Supla::Html::ProtocolParameters htmlProto;

void setup() 
{
  Serial.begin(9600);

  httpUpdater.setup(suplaServer.getServerPtr(), "/update");
  
   auto buttonCfgRelay =
    new Supla::Control::Button(BUTTON_CFG_RELAY_GPIO, true, true);

  buttonCfgRelay->configureAsConfigButton(&SuplaDevice);
 // configure defualt Supla CA certificate
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
 SuplaDevice.begin();  

 timeClient.begin();
 timeClient.setTimeOffset(3600);// GMT+1(zimowy)= 3600; letni=7200
   sekund10.begin(9985);
  //int day=31,month=1,year=2024;

  //             LATITUDE    LONGITUDE   TZ   DATE            
  //printRiseAndSet(50.0169,    18.8098,  +1,  monthDay,currentMonth,currentYear);

}

void loop() { 
     SuplaDevice.iterate();
     pobierzCzas();
  }

void pobierzCzas(){
  if(sekund10.available()){
  timeClient.update();
  unsigned long epochTime = timeClient.getEpochTime();
  currentHour = timeClient.getHours();
  currentMinute = timeClient.getMinutes();
  weekDay = timeClient.getDay();

  struct tm *ptm = gmtime ((time_t *)&epochTime); 
  monthDay = ptm->tm_mday;
  currentMonth = ptm->tm_mon+1;
  currentYear = ptm->tm_year+1900;
  printRiseAndSet(1.xxxxx,    1.xxxx,  +1,  monthDay,currentMonth,currentYear);
  sekund10.restart();
  }
}

Logi:

end: [53 55 50 4C 41 ]
Recv: [53 55 50 4C 41 10 0F 00 00 00 32 00 00 00 10 00 00 00 FA 79 B9 65 00 00 00 00 92 E5 05 00 00 00 00 00 53 55 50 4C 41 ]
  Wschod: 7h21m  Zachod:  16h34m
  Wschod: 7h21m  Zachod:  16h34m
  Wschod: 7h21m  Zachod:  16h34m

 

Edytowano przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

SOYER kupujesz H801 wgrywasz Suple.

Po co ci NTP w bibliotece Supli masz metode clock.

SuplaDevice.addClock(new Supla::Clock);

...
auto clock1 = SuplaDevice.getClock();
if (clock1->getHour() == 17) {
...
}

 

Link do komentarza
Share on other sites

(edytowany)

Dlatego, że oprócz pasków led na tym esp32 mam jeszcze 4 przekaźniki, krańcówki, obsługę pralki i wodomierza.

Same funkcjonalności supli i tak nie pozwoliły by mi zrobić takich scen oświetlenia podjazdu.

Już używam klasy clock z supli, projekt się trochę zmienił, a ja cały czas się uczę nowych rzeczy.

Edytowano przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.