nathanas Δημοσ. 3 Ιουλίου 2010 Δημοσ. 3 Ιουλίου 2010 Να ρωτήσω και γω κάτι για arduino? Πρόσφατα τον έπιασα στα χέρια μου και πήρα και την nokia 3310 LCD Shield από nuelectronics.com καθώς και τα αισθητήρια θερμοκρασίας. http://www.nuelectronics.com/estore/...products_id=12 http://www.nuelectronics.com/estore/...products_id=28 Θέλω πέρα από το serial monitor να μπορώ να εμφανίσω τις τιμές και στην οθόνη LCD, αλλά επειδή είναι σε byte values (2 digits), δεν μπορώ... Ξέρω μόνο να τυπώνω string... Κάποιος να μου πει τι κώδικα να χρησιμοποιήσω για να το κάνω...Χρησιμοποιώ την "nokia_3310_lcd.h" library. [bold]Ή απλώς πως να μετατρέψω τo byte σε sting![/bold] Διότι string μπορώ να εμφανίσω στην οθόνη... Ο κώδικας τρέχει κανονικά και το παρακάτω σημείο είναι αυτό που θέλω να εμφανίσω και στην οθόνη πέρα από τον serial monitor, στο οποίο οι τιμές εμφανίζονται κανονικά. "Current humdity = 57.0% temperature = 29.0C" ----------- Serial.print("Current humdity = "); Serial.print(dht11_dat[0], DEC); Serial.print("."); Serial.print(dht11_dat[1], DEC); Serial.print("% "); Serial.print("temperature = "); Serial.print(dht11_dat[2], DEC); Serial.print("."); Serial.print(dht11_dat[3], DEC); Serial.println("C "); --------------------------- Και ολόκληρος ο κώδικας: ----------- #include "nokia_3310_lcd.h" char numStr[8]; #define DHT11_PIN 0 // ADC0 Nokia_3310_lcd lcd=Nokia_3310_lcd(); byte read_dht11_dat() { byte i = 0; byte result=0; for(i=0; i< 8; i++){ while(!(PINC & _BV(DHT11_PIN))); // wait for 50us delayMicroseconds(30); if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i)); while((PINC & _BV(DHT11_PIN))); // wait '1' finish } return result; } void setup() { lcd.LCD_3310_init(); lcd.LCD_3310_clear(); lcd.LCD_3310_write_string( 0, 1, "Nokia 3310 LCD", MENU_NORMAL); lcd.LCD_3310_write_string( 0, 3, "NaThAN", MENU_NORMAL); lcd.LCD_3310_write_string( 13, 4, "Electronics!", MENU_NORMAL); delay(1000); lcd.LCD_3310_clear(); DDRC |= _BV(DHT11_PIN); PORTC |= _BV(DHT11_PIN); Serial.begin(19200); Serial.println("Ready"); } void loop() { byte dht11_dat[5]; byte dht11_in; byte i; // start condition // 1. pull-down i/o pin from 18ms PORTC &= ~_BV(DHT11_PIN); delay(18); PORTC |= _BV(DHT11_PIN); delayMicroseconds(40); DDRC &= ~_BV(DHT11_PIN); delayMicroseconds(40); dht11_in = PINC & _BV(DHT11_PIN); if(dht11_in){ Serial.println("dht11 start condition 1 not met"); return; } delayMicroseconds(80); dht11_in = PINC & _BV(DHT11_PIN); if(!dht11_in){ Serial.println("dht11 start condition 2 not met"); return; } delayMicroseconds(80); // now ready for data reception for (i=0; i<5; i++) dht11_dat = read_dht11_dat(); DDRC |= _BV(DHT11_PIN); PORTC |= _BV(DHT11_PIN); byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3]; // check check_sum if(dht11_dat[4]!= dht11_check_sum) { Serial.println("DHT11 checksum error"); } char n=i; Serial.print("Current humdity = "); Serial.print(dht11_dat[0], DEC); Serial.print("."); Serial.print(dht11_dat[1], DEC); Serial.print("% "); Serial.print("temperature = "); Serial.print(dht11_dat[2], DEC); Serial.print("."); Serial.print(dht11_dat[3], DEC); Serial.println("C "); lcd.LCD_3310_write_string( 0, 0, "Humidity Sensor...", MENU_NORMAL); lcd.LCD_3310_write_string( 0, 3, "temp = ", MENU_NORMAL); lcd.LCD_3310_write_byte( dht11_dat[2],DEC); //Here is the problem.... // How can i make the byte array printed on the lcd screen?? PLEASE HELP!!!! delay(2000); } ------------------------------- Please κάποιος να με βοηθήσει... Οποιοσδήποτε που έχει περάσει τιμές από αισθητήρια σε οθόνη πρέπει να έχει αντιμετωπίσει το ίδιο πρόβλημα...
warchief Δημοσ. 3 Ιουλίου 2010 Δημοσ. 3 Ιουλίου 2010 Ουσιαστικά θέλεις να τυπώσεις τις αριθμητικές τιμές που είναι μέσα στον πίνακα dht11_dat στην LCD. Μπορείς να το κάνεις με 2 τρόπους (και περισσότερους). Με λίγο google διαπίστωσα ότι οι περισσότεροι το κάνουν με την itoa, αλλα μπορείς να το κάνεις και με την sprintf. > #include <string.h> // Needed for memset char buffer[64]; snprintf(buffer, 64, "Humidity sensor: %d.%d%%", dht11_dat[0], dht11_dat[1]); lcd.LCD_3310_write_string( 0, 0, buffer, MENU_NORMAL); // Zero out the buffer memset(buffer, 0x00, 64); snprintf(buffer, 64, "Temperature sensor: %d.%dC", dht11_dat[2], dht11_dat[3]); lcd.LCD_3310_write_string( 0, 3, buffer, MENU_NORMAL);
nathanas Δημοσ. 3 Ιουλίου 2010 Μέλος Δημοσ. 3 Ιουλίου 2010 Εισαι θεός λειτουργεί κανονικότατα. μήπως μπορείς να μου εξηγήσεις τί έψαξες στο net?Και τί κάνει αυτή η εντολή σε σχέση με την itoa...? ακόμα με το %d.%d%% τί εννούμε? ότι σπαμε το byte σε x.xx τιμές?
warchief Δημοσ. 3 Ιουλίου 2010 Δημοσ. 3 Ιουλίου 2010 H itoa : > char * itoa ( int value, char * str, int base ); Σου επιστρέφει την αριθμητική τιμή του ακεραίου value στο string που δείχνει ο pointer str. Μπορείς να διαβάσεις περισσότερα εδώ: http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ Μεταξύ των οποίων: This function is not defined in ANSI-C and is not part of C/C++, but is supported by some compilers. A standard-compliant alternative for some cases may be sprintf. Σχετικά με το format της snprintf (και κάθε μέλους της οικογενείας printf): το πρώτο %d εκτυπώνει την τιμή του dht11_dat[0] σαν ακέραιου (d=decimal), ενώ το %% εκτυπωνει (%), μιας και το % σκέτο είναι special character και χρησιμοποιείτε για να εκτυπώσει κάποιο όρισμα που ακολουθεί την printf (όπως είδες πριν με το %d). http://www.cppreference.com/wiki/c/io/sprintf Επίσης (αυτο που βρήκα με λίγο google ειναι το API της LCD, εδώ: http://www.dgkelectronics.com/storage/electronics/thermometer/nokia_3310_lcd2/nokia_3310_lcd.h
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.