Bir başlıkta bildirilen bir döngü sayacı kullanıyorum:
int loop_counter = 0;
Bu sayacı sık sık bir olayı tetiklemek için kullanıyorum. Aynı tür davranışlar için bir modulo kullanıyordum, ancak basitleştirdim, böylece çalışmak daha kolay (yine de aynı davranışla sonuçlanıyor)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Tüm ben ile iletişim deneyin kadar iyi ve güzel Serial
uncommenting //Serial.println("hey");
( "hey"
bu örnekte, çünkü bana göre bu davranış saçma).
Bu loop_counter
hiçbir zaman do_something_important();
kod bölümünü tetiklemez . Ben bildirerek çalıştı loop_counter
olarak volatile
herhangi bir değişiklik olmadığını,. Denedim Serial.print
ing loop_counter
ve ben de (o döngü donduracak) garip davranışları başlamıştı. Serial.println("hey");
Seri monitörde bolca "hey", yani kodun diğer bölümünün tetiklemesi gereken yineleme sayısından çok daha fazla 100 "heys" elde ettiğim anlamında çalışır
Düzgün çalışmasını tamamen önlemek için Serial
bağlı olmayan (anlayabildiğim kadarıyla) verilerle , kullanımının nedeni ne olabilir loop_counter
?
DÜZENLEME : İşte ana dosyanın sorunu ortaya çıkaran kısmı (çok, en çok katkıda bulunan kısım) (çok fazla bellek kullanarak):
void display_state() {
int i,j,index=0;
short alive[256][2];
for(i=0;i<num_rows;i++) {
for(j=0;j<num_cols;j++) {
if(led_matrix[i][j]==1) {
alive[index][0]=i;
alive[index][1]=j;
index++;
}
}
}
alive[index][0]=NULL; //Null-terminate.
alive[index][1]=NULL;
//383 is a great number
for(int idx=0;idx < index; idx++) {
display(alive[idx][0],alive[idx][1]);
delayMicroseconds(283);
}
}
İşte "letters.h":
#ifndef _MY_LETTERS_H #define _MY_LETTERS_H
#define nrows 4 #define ncols 4 #define num_rows 16 #define num_cols 16 #define MAX_WORD_LENGTH 16 #define NUMBER_OF_CHARACTERS 26 #include <stdlib.h>
int loop_counter = 0 ; kısa led_matriks [ num_rows ] [ num_cols ];
sabit kısa letter_a [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 0 }, { 1 , 0 , 0 , 1 }, { 1 , 1 , 1 , 1 }, { 1 , 0 , 0 , 1 } }; sabit kısa mektup_b [ nrows ] [ ncols ] = {{ 1 , 0 , 0 , 0 }, { 1 , 1 , 1 , 0 }, { 1 , 0 , 1 , 0 }, { 1 , 1 , 1 , 0 }}; const kısa letter_c [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 1 }, { 1 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 }, { 0 , 1 , 1 , 1 }}; sabit kısa letter_t [ nrows ] [ ncols ] = {{ 1 , 1 , 1 , 1 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 } };
typedef struct letter_node { const short * verileri ; letter_node * sonraki ; int x ; int y ; } letter_node ;
letter_node aa = {&letter_a[0][0],NULL,1,1}; letter_node bb = {&letter_b[0][0],NULL,1,1}; letter_node cc = {&letter_c[0][0],NULL,1,1}; letter_node tt = {&letter_t[0][0], NULL , 1 , 1 };
letter_node letter_map [ NUMBER_OF_CHARACTERS ]; #endif
Daha fazla bilgi: - Bir Uno kullanıyorum (ATMega328)
loop()
işlevde kullanıyorum. Sahip olduğum tek çıkış yöntemi ( Serial.print()
) beni başarısız ediyorsa yığınımı nasıl boyamalıyım?