Re: Få in skiftschema i arduino.
Postat: 2 januari 2016, 09:57:30
Hur lagrar man lämpligast tiden i microcontrollern? Är unix timestamp i en unsigned long-variabel (32-bitar) vägen att gå?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
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;
}
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;
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
}
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);
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
}