Εμφάνιση byte ως string στην οθόνη LCD 3310...

ανεβάστε διάφορους κώδικες για κατασκευές ή ζητήστε βοήθεια…

Εμφάνιση byte ως string στην οθόνη LCD 3310...

Δημοσίευσηαπό nathanas την 02 Ιούλ 2010 08:08

Να ρωτήσω και γω κάτι για 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[i] = 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 κάποιος να με βοηθήσει... Οποιοσδήποτε που έχει περάσει τιμές από αισθητήρια σε οθόνη πρέπει να έχει αντιμετωπίσει το ίδιο πρόβλημα...
nathanas
 
Δημοσ.: 2
Εγγραφη: 02 Ιούλ 2010 08:02

Re: Εμφάνιση byte ως string στην οθόνη LCD 3310...

Δημοσίευσηαπό nathanas την 03 Ιούλ 2010 06:51

Μιας και το πρόβλημα λύθηκε...
Ποστάρω τον κώδικα για να εξυπηρετηθεί και κάποιος άλλος που μπορεί να αντιμετωπίσει το ίδιο πρόβλημα...

Ουσιαστικά θέλεις να τυπώσεις τις αριθμητικές τιμές που είναι μέσα στον πίνακα dht11_dat στην LCD. Μπορείς να το κάνεις με 2 τρόπους (και περισσότερους). Με λίγο google διαπίστωσα ότι οι περισσότεροι το κάνουν με την itoa, αλλα μπορείς να το κάνεις και με την sprintf.
Ουσιαστικά, ο παρακάτω κώδικας μας τυπώνει τις αριθμητικές τιμές που είναι μέσα στον πίνακα dhtll_dat στην LCD μας....Με την εντολή sprintf.
Γίνεται και με κάποιον άλλο τρόπο απ'ότι είδα στο net. Με την itoa, που πολλοί προτιμούν για την εμφάνιση σε οθόνη.. Αν και εγώ δεν ξέρω πως λειτουργεί.

Κώδικας: Επιλογή όλων
#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
 
Δημοσ.: 2
Εγγραφη: 02 Ιούλ 2010 08:02


Επιστροφή στην Κώδικες

Μελη σε συνδεση

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης