Τα προβλήματα μου ακόμη κι όταν παλεύω μόνο 5 γραμμές κώδικα συνεχίζονται στον μαγευτικό κόσμο του Arduino:
Προσπαθώ απλός να αντιγράψω τον κώδικα που είχα βρεί (link) για να μετράω την Vcc.
Έχω δύο κομμάτια, το ένα που κάνει όλη την μαγεία και φυλάει το αποτέλεσμα σαν "readVcc", και το δεύτερο απλός τυπώνει το αποτέλεσμα στην LCD, τόσο απλά.
Όταν είναι και τα δύο παρεΐτσα στο "void loop ()" δουλεύει και μου δίνει πχ "4712" στην οθόνη (εκτός του timer) αφού όμως τυπώσει μία και μόνο φορά στην αρχή "-1" (ίσα που προλαβαίνεις να το δεις με αυτές τις τιμές delay). Μετά έχω πάντα "4712", δεν αλλάζει. Δεν είναι σωστή η μέτρηση των 4712mV αλλά θα γίνει ρεγουλάρισμα του "readVcc = 1126400L / readVcc;" όταν με καλό δουλέψει ο κώδικας όμως.
Κώδικας:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 4, 6, 7, 8, 9);
void setup()
{
lcd.begin(20, 2);
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(millis() / 1000);
long readVcc;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(100);
ADCSRA |= _BV(ADSC);
readVcc = ADCL; readVcc |= ADCH<<8; readVcc = 1126400L / readVcc;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(readVcc);
delay(100);
}
Όμως εγώ δεν θέλω να μετράω συνεχώς την Vcc αλλά μόνο μία φορά στην αρχή, οπότε να μετρήσει μία φορά και μετά να έχω το αποτέλεσμα στην μεταβλητή "readVcc" για να κάνω στο loop πράξεις.
*Το ξέρω ότι μπορεί να είναι λάθος μου να πιστεύω ότι δεν θα αλλάξει η Vcc κατά την λειτουργία του κυκλώματος, αλλά αυτό είναι άλλο θέμα, ας μην ασχοληθούμε με αυτό τώρα.
Κάνω λοιπόν copy-paste τον κώδικα στο setup καιιιιιιιι........ τζίφος. Ο 100% ίδιος κώδικας στο setup, δίνει "-1" στην LCD
Κώδικας:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 4, 6, 7, 8, 9);
void setup()
{
lcd.begin(20, 2);
long readVcc;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(100);
ADCSRA |= _BV(ADSC);
readVcc = ADCL; readVcc |= ADCH<<8; readVcc = 1126400L / readVcc;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(readVcc);
delay(100);
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(millis() / 1000);
}
Αυτό το -1 στην αρχή λέω είναι, ας μεγαλώσω το delay. Αλλά ακόμα και 5000 + άλλα 5000 μετά καθυστέρηση να βάλω όπως παρακάτω, πάλι "-1" έχω...
long readVcc;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(5000);
ADCSRA |= _BV(ADSC);
readVcc = ADCL; readVcc |= ADCH<<8; readVcc = 1126400L / readVcc;
delay(5000);
Και τώρα το κερασάκι στην τούρτα: Αν κρατήσω το κομμάτι της μέτρησης στο setup και πάω απλός να τυπώσω την readVcc στο loop, δεν περνάει από compile, μου λέει "δεν μου δήλωσες ποτέ τι είναι αυτό το 'readVcc' που θες να τυπώσεις" !!! Πως είναι δυνατόν, αφού το "long readVcc;" δεν άλλαξε θέση! Μόνο το κομμάτι που του ζητάω να μου τυπώσει την μεταβλητή μετέφερα, και στο loop, όχι σε τίποτα functions ή κάτι περίπλοκο...
Αυτός ο κώδικας:
Κώδικας:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 4, 6, 7, 8, 9);
void setup()
{
lcd.begin(20, 2);
long readVcc;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(100);
ADCSRA |= _BV(ADSC);
readVcc = ADCL; readVcc |= ADCH<<8; readVcc = 1126400L / readVcc;
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(millis() / 1000);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(readVcc);
delay(100);
}
Βγάζει μήνυμα: 'readVcc' was not declared in this scope
Arduino: 1.6.5 (Windows 7), Board: "Arduino Nano, ATmega328"
sketch_apr04b.ino: In function 'void loop()':
sketch_apr04b:35: error: 'readVcc' was not declared in this scope
'readVcc' was not declared in this scope
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Μετά μου λέτε για C++ και Assembly...