Få in skiftschema i arduino.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Få in skiftschema i arduino.

Inlägg av Zkronk »

Hur lagrar man lämpligast tiden i microcontrollern? Är unix timestamp i en unsigned long-variabel (32-bitar) vägen att gå?
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Få in skiftschema i arduino.

Inlägg av orvar-e »

Hur menar du, lagrar tiden från RTC? Eller lagra en tid som ska göra nått?

I den RTC koden jag använder mig av så används en byte för sekund en för minut osv till år.
Och sedan göres den om till BCD för att få värden mellan 0 och 9. (tror jag)
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Få in skiftschema i arduino.

Inlägg av Zkronk »

Jag tänkte på det IceCap skrev, att man låter en interrupt som triggas av 1 Hz-pulsen från DS3231 räkna upp en tid-variabel i microcontrollern.
För jag antar att bara addera 1 till en variabel med unix timestamp går betydligt snabbare än att addera först 1 till en sekund-variabel, för att sen kolla om det är tillräckligt många sekunder för att minut-variabel ska ökas med 1 osv...?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Få in skiftschema i arduino.

Inlägg av Icecap »

Jag sparar tiden i (nästan) UNIX-format, alltså antal sekunder sedan ett specifikt datum.

Min tappning är dock att UNIX specificerar variabeln som en signed long (32 bit) medan jag använder en unsigned long.

Självklart har jag konverteringsrutiner HH:MM:SS <-> UNIX.
Användarvisningsbild
hawkan
Inlägg: 2586
Blev medlem: 14 augusti 2011, 10:27:40

Re: Få in skiftschema i arduino.

Inlägg av hawkan »

Måste erkänna att jag inte följt med era tankegångar riktigt.
Arduino-biblioteket jag länkade till kan sätta tiden också, så med knappar eller nåt går det att justera tiden i RTCn. Eller ladda i ett annat program i Arduinon som sätter om tiden.
Det finns även en funktion getUnixTime() som ger en long tid a'la Unix.

Aah, såg detta med dfc77, kul idé!
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Få in skiftschema i arduino.

Inlägg av orvar-e »

Här är lite kod för att använda tempsensorn i DS3231, funkade på en gång. Men har inte testat minus grader än.
http://forum.arduino.cc/index.php?topic=262986.0

Kod: Markera allt

#include <Wire.h>
#define DS3231_I2C_ADDR             0x68
#define DS3231_TEMPERATURE_ADDR     0x11

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

void loop()
{
   int tempC = DS3231_get_treg();  // Reads the temperature as an int, to save memory
   // float tempC = DS3231_get_treg();
   delay(500);
   Serial.println(tempC);
}

float DS3231_get_treg()
{
    int rv;  // Reads the temperature as an int, to save memory
//  float rv;
    
    uint8_t temp_msb, temp_lsb;
    int8_t nint;

    Wire.beginTransmission(DS3231_I2C_ADDR);
    Wire.write(DS3231_TEMPERATURE_ADDR);
    Wire.endTransmission();

    Wire.requestFrom(DS3231_I2C_ADDR, 2);
    temp_msb = Wire.read();
    temp_lsb = Wire.read() >> 6;

    if ((temp_msb & 0x80) != 0)
        nint = temp_msb | ~((1 << 8) - 1);      // if negative get two's complement
    else
        nint = temp_msb;

    rv = 0.25 * temp_lsb + nint;

    return rv;
}
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Få in skiftschema i arduino.

Inlägg av orvar-e »

Skrivit kod för justering av sommar/vintertid. Inte kunna test köra, men jag känner mig självsäker i kväll. :)

Den ska känna av sista söndagen i mars och oktober, plussa på en timme på i mars och återställa tiden i oktober.
Borde inte vara krångligare än sådär.

Kod: Markera allt

if (month == 3 && dayOfmonth == 25 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 26 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 27 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 28 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 29 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 30 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (month == 3 && dayOfmonth == 31 && dayOfWeek == 6 && summer_t == LOW) {summer_t = HIGH;}
if (summer_t == HIGH && hour == 2 && minute == 59 && second == 59) { sw_hour = hour + 1;

//Winter time
if (month == 10 && dayOfmonth == 25 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 26 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 27 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 28 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 29 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 30 && dayOfWeek == 6) {summer_t = LOW;}
if (month == 10 && dayOfmonth == 31 && dayOfWeek == 6) {summer_t = LOW;}
if (summer_t == LOW && hour == 2 && minute == 59 && second == 59) { sw_hour = hour;
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Få in skiftschema i arduino.

Inlägg av Icecap »

Kod: Markera allt

static const _UBYTE Date_Time_Days_In_Month[2][12] = {
  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

_UBYTE Date_Time_Is_DST(_UWORD Year, _UBYTE Month, _UBYTE Date, _UBYTE Hour)
  { // Calculated with local time!
  _UBYTE X;
  switch(Month)
    {
    case MONTH_JANUARY:
    case MONTH_FEBRUARY:
    case MONTH_NOVEMBER:
    case MONTH_DECEMBER:
      return(0); // Nope, not DST!
    case MONTH_APRIL:
    case MONTH_MAY:
    case MONTH_JUNE:
    case MONTH_JULY:
    case MONTH_AUGUST:
    case MONTH_SEPTEMBER:
      return(1); // Very much DST!
    case MONTH_MARCH: /* DST starts from last Sunday in March 02:00 local time */
      // Calculate the last sunday in March month
      X = (Date_Time_Days_In_Month[0][MONTH_MARCH - 1] + 1) - Date_Time_Day_Of_Week(Year, MONTH_MARCH, Date_Time_Days_In_Month[0][MONTH_MARCH - 1] - 6);
      if(Date < X) return(0); // Not DST
      if(Date > X) return(1); // Most positively DST
      // Now it's on the weekday, check Hour
      if(Hour >= 2) return(1);
      return(0);
    case MONTH_OCTOBER: // DST stops on the last Sunday in October 02:00 local time
      // Calculate the last sunday in October month
      X = (Date_Time_Days_In_Month[0][MONTH_OCTOBER - 1] + 1) - Date_Time_Day_Of_Week(Year, MONTH_OCTOBER, Date_Time_Days_In_Month[0][MONTH_OCTOBER - 1] - 6);
      if(Date < X) return(1); // Most positively DST
      if(Date > X) return(0); // Not DST
      // Now it's on the weekday, check Hour
      if(Hour >= 3) return(0);
      return(1);
    }
  return(0); // Mostly if unknown month
  }
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Få in skiftschema i arduino.

Inlägg av orvar-e »

Onekligen på en högre skola en de kråkfötter jag skrev i natt.
Mest imponerad är jag av raderna. Där man vaskar fram både rätt dag och tid på väldigt få instruktioner.

Kod: Markera allt

      X = (Date_Time_Days_In_Month[0][MONTH_MARCH - 1] + 1) - Date_Time_Day_Of_Week(Year, MONTH_MARCH, Date_Time_Days_In_Month[0][MONTH_MARCH - 1] - 6);
      if(Date < X) return(0); // Not DST
      if(Date > X) return(1); // Most positively DST
      // Now it's on the weekday, check Hour
      if(Hour >= 2) return(1);
      return(0);
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Få in skiftschema i arduino.

Inlägg av Icecap »

Hoppla, glömde lite:

Kod: Markera allt

_UBYTE Date_Time_Day_Of_Week(_UWORD Year, _UBYTE Month, _UBYTE Date)
  { /* 1=Monday, 2=tuesday etc. as the RTC runs like that */
  const _UWORD T[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  _UWORD Res;
  Year -= Month < 3; // Om månad < Mars ska Year = Year - 1
  Res = ((Year + Year/4 - Year/100 + Year/400 + T[Month - 1] + Date) - 1) % 7;
  return(Res + 1); // +1 för att den annars går 0-6
  }
Användarvisningsbild
Glenn
Inlägg: 33667
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Få in skiftschema i arduino.

Inlägg av Glenn »

Otroligt att ingen dragit nåt skämt om att använda skiftregister än ? :)
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Få in skiftschema i arduino.

Inlägg av orvar-e »

Haft lite tid på sistone. Funkar som en dröm. Bara att plugga i bilen i vägguttaget och den håller koll att bilen är varm när jag ska jobba, hur bekvämt som helst.
Nu har jag beställt grejer för att bygga version två.
Nu varande version är byggd i en väggvårta. Den har bara 5 dioder för indikering av, förmiddag, eftermiddag, natt, ledig, och indikering att relät är draget.
Programmera gör man genom att ta en tandpetare och trycka på den dolda prog-knappen nedanför den nedersta dioden.
Man programmerar den på den tid och skift man avser. Genom att trycka på knappen när klockan är 13:20 så kommer den se till att bilen alltid är varm på den avrese tiden + 20 minuter efter värme oavsett ute temp. Tidsuppgifterna är sparade i EEPROM:et.
Det blir nog den enklaste versionen, version två får jag berätta mer lite senare .......
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar