Få in skiftschema i arduino.
Re: Få in skiftschema i arduino.
Hur lagrar man lämpligast tiden i microcontrollern? Är unix timestamp i en unsigned long-variabel (32-bitar) vägen att gå?
Re: Få in skiftschema i arduino.
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)
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)
Re: Få in skiftschema i arduino.
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...?
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...?
Re: Få in skiftschema i arduino.
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.
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.
Re: Få in skiftschema i arduino.
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é!
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é!
Re: Få in skiftschema i arduino.
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
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;
}
Re: Få in skiftschema i arduino.
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.
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;
Re: Få in skiftschema i arduino.
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
}
Re: Få in skiftschema i arduino.
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.
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);
Re: Få in skiftschema i arduino.
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
}
Re: Få in skiftschema i arduino.
Otroligt att ingen dragit nåt skämt om att använda skiftregister än ?
Re: Få in skiftschema i arduino.
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 .......
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.