2013-03-23 4 views
0

Я пишу код для лампы, которая имитирует солнце (т.е. поднимается и садится в соответствии с реальным солнцем).Почему статическая переменная не позволяет запустить loop()?

Я пытаюсь использовать статическую переменную в цикле, чтобы вести счет дней с момента 1/1/12 (последний високосный год (366 дней))

по какой-то причине, программа только работает, когда переменная не объявлена ​​как статическая, но мне нужно, чтобы счетчик продолжался через итерацию каждого дня.

Любая помощь будет высоко оценена. Спасибо.

// Sun Object 

#define REDPIN 5 
#define GREENPIN 6 
#define BLUEPIN 3 

//#define FADESPEED 480// make this higher to slow down 
#define FADESPEED 120 

void setup() { 
    pinMode(REDPIN, OUTPUT); 
    pinMode(GREENPIN, OUTPUT); 
    pinMode(BLUEPIN, OUTPUT); 


} 

void loop() { 

    // daylengths for 4 year's worth of days starting from jan 1 of Great year (366 days) (1/1/2012) 
int dayLengths[] = {33540000, 
33540000, 
33600000, 
// .... 
// hundreds of values omitted here 
// .... 
33360000, 
33420000, 
33480000, 
33480000}; 


//2012 = 366 days + day # from jan 1st (in 2013) 
//starts on 0th day so subtract 1 
//ready to go for march 24st @ sunrise 

// why does it not function when day is static????? 

    static int day = 449; 


    int r, g, b; 




    long start = millis(); 

    for (r = 0; r <256; r++){ 
    analogWrite(REDPIN, r); 
    delay(FADESPEED); 
    } 

    //analogWrite(REDPIN, 255); 

for (g = 0; g < 230; g++) { 
    analogWrite(GREENPIN, (g*.4)); 
    delay(FADESPEED*2); 

    } 

    long stopped = millis(); 
    long elapsed = stopped - start; 
              //approx 
    // delays (amount of daylight - (sunrise/sunset time) 
// delay(dayLengths[day]- (97200*2)); 

    delay(dayLengths[day]- (elapsed*2)); 


    for (g = 230; g > 0; g--) { 
    analogWrite(GREENPIN, (g*.4)); 
    delay(FADESPEED*2); 
    } 

    for (r = 256; r >0; r--){ 
    analogWrite(REDPIN, r); 
    delay(FADESPEED); 
    } 

    analogWrite(REDPIN,0); 


    //delays (millis in 1 day) - (length of daylight) 
    delay(86400000 - dayLengths[day]); 



    // once 4 year cycle is over, resets day to 0 
    if (day < sizeof(dayLengths )){ 

    day++; 
    } 

    else 
    { 
    day = 0; 

    } 

} 
+2

Пожалуйста, сообщите нам, какая у вас ошибка. Что на самом деле происходит при запуске программы или есть ошибка компилятора. Если да, то какая ошибка? – Flayneorange

+4

«Это не работает» - это ужасное описание проблемы. –

+0

Попробуйте воспроизвести эту проблему на небольшом примере. Вы дали нам массив из 365 предметов, но не одно определение функции - поэтому мы не можем воспроизвести и прочитать этот код. –

ответ

0

Это звучит, как вы работаете во встроенной среде, и вполне возможно, что нативный аппаратного имеет некоторые ограничения повторно: статическое использование внутри функции loop.

Я уже ненавижу себя за предложение, но, может быть, вы могли бы попробовать global или global static использование (т.е. поместить переменную day вне функции loop(), с или без static ключевого слова). Это даст ему возможность жить по всем звонкам loop() ...

Смежные вопросы