Вывод показаниq датчика DHT22 на экран Nokia LCD 5110
- Войдите на сайт для отправки комментариев
Задача:
1. Вывести показания датчика DHT22 на экран Nokia LCD 5110
Оборудование:
2. Arduino Nano V3.0 ATmega328
3. DHT22
4. Nokia LCD 5110
Решено:
Датчик подключен, и выбрасывает показания в COM порт.
Экран подключен, и показывает отправленный на него текст.
Ошибка:
Проблема с отображением значений переменнох «t» и «h» на экран.
Ошибка в компиляторе,
DHT22_LCD_5110.ino: In function 'void loop()':
DHT22_LCD_5110:221: error: cannot convert 'float' to 'char*' for argument '1' to 'void LcdString(char*)'
Код программы:
// 27.01.2013 DHT22 + NOKIA LCD 5110 //--> DHT22 #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22 // DHT 22 (AM2302) DHT dht(DHTPIN, DHTTYPE); //-- //--> LCD 5110 #define PIN_SCE 7 #define PIN_RESET 6 #define PIN_DC 5 #define PIN_SDIN 4 #define PIN_SCLK 3 #define LCD_C LOW #define LCD_D HIGH int count=0; char dat[4]; char disp_tab[]={'0','1','2','3','4','5','6','7','8','9'}; #define LCD_X 84 #define LCD_Y 48 char buf[72]="A_simple_example_of_interfacing_with_the_84_x_48_pixel_Nokia_3310_LCD!!"; static const byte ASCII[][5] = { {0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 ! ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 " ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $ ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 % ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 & ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 ' ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 ( ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ) ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a * ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b + ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c , ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d - ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e . ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f / ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0 ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1 ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2 ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3 ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4 ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5 ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6 ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7 ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8 ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9 ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a : ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ; ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c < ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d = ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e > ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ? ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @ ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [ ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥ ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ] ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^ ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _ ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 ` ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b { ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c | ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d } ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ← ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f → }; void LcdCharacter(char character) { LcdWrite(LCD_D, 0x00); for (int index = 0; index < 5; index++) { LcdWrite(LCD_D, ASCII[character - 0x20][index]); } LcdWrite(LCD_D, 0x00); } void LcdClear(void) { for (int index = 0; index < LCD_X * LCD_Y / 8; index++) { LcdWrite(LCD_D, 0x00); } } void LcdInitialise(void) { pinMode(PIN_SCE, OUTPUT); pinMode(PIN_RESET, OUTPUT); pinMode(PIN_DC, OUTPUT); pinMode(PIN_SDIN, OUTPUT); pinMode(PIN_SCLK, OUTPUT); digitalWrite(PIN_RESET, LOW); digitalWrite(PIN_RESET, HIGH); LcdWrite(LCD_C, 0x21 ); // LCD Extended Commands. LcdWrite(LCD_C, 0xB1 ); // Set LCD Vop (Contrast). LcdWrite(LCD_C, 0x04 ); // Set Temp coefficent. //0x04 LcdWrite(LCD_C, 0x14 ); // LCD bias mode 1:48. //0x13 LcdWrite(LCD_C, 0x0C ); // LCD in normal mode. LcdWrite(LCD_C, 0x20 ); LcdWrite(LCD_C, 0x0C ); } void LcdString(char *characters) { while (*characters) { LcdCharacter(*characters++); } } void LcdWrite(byte dc, byte data) { digitalWrite(PIN_DC, dc); digitalWrite(PIN_SCE, LOW); shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); digitalWrite(PIN_SCE, HIGH); } void gotoXY(int x, int y) { LcdWrite( 0, 0x80 | x); // Column. LcdWrite( 0, 0x40 | y); // Row. } void setup() { //DHT22 Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); //-- // ------ analogReference(DEFAULT); LcdInitialise(); LcdClear(); LcdString("- - TEST - -"); // line 0 gotoXY(0, 2); LcdString("++++++++++++"); // line 2 LcdClear(); // LcdString(buf); } void loop(){ //DHT22 float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); delay(2000); } //--- delay(300); gotoXY(0, 0); LcdString("----TEMP----"); // line 0 delay(300); gotoXY(0, 2); LcdString(t); // Линия 2 экрана, отображение Температуры с датчика }
Ругается на 221 строчку кода
Я так понимаю что проблема в несовместимости значений переменных 'float' и 'char*'
И значение датчика надо куда то поместить промежуточно, и уже потом отправить его на экран.
Ответа не нашел поиском.
диагностировали правильно :). Теперь осталось погуглить что-то типа "преобразование типов", "преобразовать число в строку" и т.п.
Аналогичная проблема , хотел перейти от WH1602 к LCD т.к информации можно вывести больше.
Из примеров подключения нашел подобный код , переделал LcdCharacter() для понимания русского языка (т.к там по 2 байта).
проверил , текст выводит обрадовался и отложил arduino до лучших времён ( когда пригодится).
Настало время для простого минитеста (поделки ) нужно было считать несколько аналоговых выводов(напряжение,ток итд) и вывести их на дисплей. А не тут то было , значения в float а функция хочет массив с char.
и получаем соответсвенно такуюже ошибку как и у топикстартера .
для примера попробывал просто создать строковую переменную и отдать в функцию , строковые данные также не принимает .
error: cannot convert 'String' to 'char*' for argument '1' to 'void LcdString(char*)'
как быть ? как изменить LcdString() что бы она хавала всё подряд ?
Либо вы отказываетесь от использования String в пользу string, либо перед тем как скормить функции LcdString(); строку переводите в массив символов, прочитав описание класса String и воспользовавшись его методами toCharArray() и length().
спасибо за быстрый ответ , не стал сильно ждать решил еще порыскать инет .
отыскал драйвер (библиотеку ) на PCD8544 , с примером термометра , там немного подругому сделанно , но все строки и переменые фоспринимает как должное , естественное свою хотелку быстро переписал под эту библиотеку , успешно вывел свои показания на дисплей.
Но есть одно как всегда НО! Русский язык как всегда отсутсвует.
Думаю у вас есть подобная библиотека , вот задумал надо бы её расширить для понимания и ненадо городить с ошибками которые выше.
Для примера как выше расширял вот таким методом.
на некоторые вещи не смотрите , закоменченно т.к проверял многое =) , практически методом научного тыка , В С++ не силён как и только начал осваивать микроконтролерную жизнь , занятся С решил из-за знания php а они похожи.
Может совместными усилиями создадим нормальную библиотеку (драйвер) к подобным дисплеям с пониманием русского языка , а может у кого есть еще заначки разных шрифтов и символов.
Решилось использованием другой библиотеки.
Ссылка на статью: http://code.google.com/p/pcd8544/
Библиотека: http://pcd8544.googlecode.com/files/PCD8544-1.4.zip
Код программы:
Здравствуйте. Я начинающий праграммист AVR контроллеров. Сейчас хочу сделать примерно такой-же как у вас датчик температуры и влажности с использованием сенсора DHT22, в дальнейшем хочу сделать регулирование влажности и температуры, делаю всё это для погреба. Вот ищу уже целый день в интернете рабочий пример кода, тут наткнулся на ваш. Я только начинаю работать на языке "C". Не могли бы вы сказать, чем вы компилировали ваш код, в какой программе. Сам начал изучать CodeVisionAVR и на нём успешно сделал терморегулятор на DS18B20, ну это так к слову. И скажите еще пожалуйста где вы нашли эту библиотеку DHT.h для DHT22. Если можете скинте свой рабочий проект со всеми необходимыми библиотеками мне на email (smirnov88@inbox.ru). Заранее благодарен!
https://github.com/ringerc/Arduino-DHT22/archive/master.zip
дак есть один парень который уже все сделал - разработал супер пупер программу, ты можешь сам рисовать свои иероглифы - http://ikarab.narod.ru/KS0108.html
для теста можешь импортировать строку какого то символа - сразу все пойиешь как делается
чуть ли не забыл, в самом низу страницы последняя версия программы, ее и качай. Программу тестировал га своем 5110, у меня все получилось
Решилось использованием другой библиотеки.
Ссылка на статью: http://code.google.com/p/pcd8544/
Библиотека: http://pcd8544.googlecode.com/files/PCD8544-1.4.zip
Код программы:
Добрый день! Попробовал скомпилить Ваш скетч - ругается на 24 строку. Что я делаю не так? Пока только пробую разбираться что к чему...
Добрый день! Попробовал скомпилить Ваш скетч - ругается на 24 строку. Что я делаю не так?
Как минимум то что не говорите какая именно ошибка. На "ругается,что не так?" наиболее правильным ответо "что-то".
Только - гадать. Скорее всего - библиотеку не поставили (или криво/не туда).
Не импортировали библиотеку.
Пишет : "DHT is not a type" Библиотека лежит в папке Librarys
А как вы ее туда положили? Фаил.zip распаковали? А случайно в папке PCD8544-1.4 не лежит еще папка PCD8544-1.4 ? И на всякий переименуйте папку в PCD8544.
В папке Librarys лежит папка DHT, в которой лежат файлы dht.cpp и dht.h C PCD8544 все в порядке.
А не может это быть связано с версией Arduino IDE( у меня 1.0.2)? Просто сталкивался с таким с CVAVR.
Если вы скачали библиотеку та что выше по ссылке, то там файлы DHT22.h/.cpp, а не dht.h/.cpp, следовательно и подключать нужно #include "DHT22.h", да и методы там маленько другие.
Я их переименовывал в dht и пробовал другую библиотеку - результат один
Я их переименовывал в dht и пробовал другую библиотеку - результат один
Заметил в Вашем коде нет строки dht.begin();- не нужна?
В этой библиотеке в классе DHT22 ее нет, значит не нужна.
Спасибо большое! Вечером буду пробовать!
Проверил - получилось! Скомпилировалось, залилось, показывает, но не меряет. Выдает -99.50 в обоих каналах. В связи с этим вопрос:
вход датчика указывается только в #define DHTPIN 2, или еще где нибудь? Можно ли как-то проверить работоспособность датчика?
Попробовал скетч из примера в библиотеке DHT22 - датчик работает. Что делать, не соображу никак...
Подскажите как допилить библиотеку отсюда http://code.google.com/p/pcd8544/ чтоб выводила кириллицу. Дополнить таблицу символов кириллицой оказалось недостаточно. В этом си-образном языке только начинаю разбираться, путаюсь.
Вот файл charset.cpp с кириллицей:
Если вы скачали библиотеку та что выше по ссылке, то там файлы DHT22.h/.cpp, а не dht.h/.cpp, следовательно и подключать нужно #include "DHT22.h", да и методы там маленько другие.
С этим кодом, на дисплее "-99.50" влажность и температура при использовании DHT11 и DHT22. Почему так?
Друзья, у меня тоже проблема с датчиком DHT22 .
И температуру и влажность выводит на дисплей LCM1602 как -99,50 .
Датчик уже с платой, на которой SMD конденсатор 512 (5100 Ом же?) и конденсатор, судя по окраске.
По совету странной статьи пробовал через дополнительный на 500 Ом подключить в разрез Vcc, но картина не меняется.
Может библиотека какая-то другая нужна? Или датчик в мусорку? Напрягает именно тот факт даже.. что нет температуры? -99,50
Собственно вопрос:
Вы решили проблему? Как? Заранее буду вам благодарен!
Одно уже понял , что -99,50 показывает если даже ко входу датчик не подключен. Другими словами с датчика не приходят данные.
Может SMD конденсатор мертв? Зачем он вообще там, как фильтр питания? Есть смысл выпаять его и зашунтировать? И вообще выпаять с китайской платы датчик и впаять через 10кОм резистор в свою?
Поправка, китайский SMD с надписью 512 мультиметром показывает 2.36кОМ
Все, глубокой ночью разобрался в неправильном применении функций объявленной библиотеке DHT.h
грубо говоря библиотека одна, а код пишу под другую. Ну таккосвенными логическими суждениями к этому пришел, покопал экхамплы, открыл библиотеки и как-то ночью сквозь дремоту все пригло в голову само.
Все супер, идем дальше )
Всем добрый день.
Кто сталкивался с такой проблемой!!!
Экран TFT LCD 1.44'' 128x128 V2.1, библиотека Adafruit_GFX, драйвер TFT_ILI9163C. Тип МК Arduino Uno R3. Тактовая частота МК 16Мг.
Чтобы обновить показания канала АЦП на экране , нужно сначало стереть старое число , а потом записать новое на его место. Так вот происходить мерцание выводимых символов. Не пойму в чем дело. Догадываюсь , что не тянет сам TFT ?.