Перейти к содержимому



Arduino Термометр с русскими буквами

Arduino DHT11 Liquid Crystal HD44780 russian temperature humidity Ардуино температура влажность

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 23 Октябрь 2013 - 23:12

Как известно, большинство дисплеев для Arduino не руссифицированы. Однако, есть возможность задавать до 8 произвольных символов. Благодаря этому мне удалось реализовать работу дисплея с поддержкой русских букв. Что в итоге получилось смотрите сами.

Изображение

Датчик температуры здесь используется в основном для иллюстрации возможностей.
Отдельно так же создается символ для отрисовки значка градуса.

Пример скетча:

У меня используются выходы
Под дисплей цифровые 10, 11, 12, 13, аналоговые A0, A1
Под датчик влажности и температуры A2
Данные выходы используются в виду удобства подсоединения к моему варианту платы.

// include the library code:
#include <LiquidCrystal.h>
#include <dht11.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(10, 11, 12, 13, A0, A1);
int DHT11PIN = A2;
dht11 DHT11;

////////////////////////////////////////////////////////////////////
// initialize display
// 3rd parameter is a string containing some needed russian characters from "БГДЖЗИЙЛПУФЦЧШЩЬЪЫЭЮЯ"
// up to 16 letters, but recommended not more than 8, anyway, i can use 16 on my lcd :)
////////////////////////////////////////////////////////////////////
static byte addon_letters[16];
void init_rus(const char* letters_use )
{
  // custom characters
  static byte letters[][8]   = {
	{ B11111, B10000, B10000, B11111, B10001, B10001, B11111, B00000 },//Б
	{ B11111, B10000, B10000, B10000, B10000, B10000, B10000, B00000 },//Г
	{ B01111, B01001, B01001, B01001, B01001, B11111, B10001, B00000 },//Д
	{ B10101, B10101, B10101, B01110, B10101, B10101, B10101, B00000 },//Ж
	{ B01110, B10001, B00001, B00110, B00001, B10001, B01110, B00000 },//З
	{ B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 },//И
	{ B10101, B10101, B10011, B10101, B11001, B10001, B10001, B00000 },//Й
	{ B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000 },//Л
	{ B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 },//П
	{ B10001, B10001, B10001, B01111, B00001, B10001, B01110, B00000 },//У
	{ B01110, B10101, B10101, B10101, B01110, B00100, B00100, B00000 },//Ф
	{ B10001, B10001, B10001, B10001, B10001, B10001, B11111, B00001 },//Ц
	{ B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000 },//Ч
	{ B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00000 },//Ш
	{ B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001 },//Щ
	{ B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000 },//Ь
	{ B11000, B01000, B01110, B01001, B01001, B01001, B01110, B00000 },//Ъ
	{ B10001, B10001, B10001, B11101, B10101, B10101, B11101, B00000 },//Ы
	{ B11110, B00001, B00001, B01111, B00001, B00001, B11110, B00000 },//Э
	{ B10111, B10101, B10101, B11101, B10101, B10101, B10111, B00000 },//Ю
	{ B01111, B10001, B10001, B01111, B10001, B10001, B10001, B00000 },//Я
  };
  static char chars[] = {'Б','Г','Д','Ж','З','И','Й','Л','П','У','Ф','Ц','Ч','Ш','Щ','Ь','Ъ','Ы','Э','Ю','Я'};
  static byte empty[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  int index = 0, cl = sizeof(chars)/sizeof(char),i,j,symb;
  memset(addon_letters,0,sizeof(addon_letters));
  for( j = 0; j < strlen(letters_use) && j < 16; j++ )
	  lcd.createChar(j, empty);

  for( j = 0; j < strlen(letters_use) && j < 16; j++ )
  {
	  symb = -1;
	  for( i=0; i < cl; i++ ) if( chars[i] == letters_use[j] ) { symb = i; addon_letters[index] = letters_use[j]; break; }
	  if( symb != -1 ) { lcd.createChar(index, letters[symb]); index++; }
  }
}
////////////////////////////////////////////////////////////////////
// print russian chars
////////////////////////////////////////////////////////////////////
void print_rus(char *str) {
  static char rus_letters[] = {'А','В','Е','Ё','К','М','Н','О','Р','С','Т','Х'};
  static char trans_letters[] = {'A','B','E','E','K','M','H','O','P','C','T','X'};
  int lcount = sizeof(rus_letters)/sizeof(char), i, j;
  for( i=0; i<strlen(str); i++ )
  { 
	if( byte(str[i]) == 208 ) continue; // 208 ignore
	int found = 0;
	for(j=0; j < 16; j++) if( addon_letters[j] != 0 && byte(str[i]) == byte(addon_letters[j]) ) { lcd.write(j); found = 1; break; }
	if(!found) for(j=0; j < lcount; j++) if( byte(str[i]) == byte(rus_letters[j]) ) { lcd.write(trans_letters[j]); found = 1; break; }
	if(!found) lcd.write(byte(str[i]));
  }  
}
void print_rus(int x, int y, char *str) {
  lcd.setCursor(x, y);
  print_rus(str);
}
////////////////////////////////////////////////////////////////////



static byte degree[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };//degree

void setup() {
  lcd.begin(16, 2);
  init_rus("УПЖЬЛ");
  lcd.createChar(7, degree);
  print_rus(0,0,"ТЕМПЕРАТУРА:");
  print_rus(0,1,"ВЛАЖНОСТЬ  :");
}

void loop() {
	int response = DHT11.read(DHT11PIN);
	if( response == DHTLIB_OK)
	{ 
		lcd.setCursor(12,0);
		lcd.print(DHT11.temperature);
		lcd.write(7);
		lcd.print("C  ");
		lcd.setCursor(12,1);
		lcd.print(DHT11.humidity);
		lcd.print("%  ");
	}
	else
	{		
		lcd.clear();
		init_rus("ШИБДЧЛЖП");
		print_rus(0,0," ОШИБКА ДАТЧИКА ");
		print_rus(0,1," ТЕМП/ВЛАЖНОСТИ ");
		do { delay(1000); } while( DHT11.read(DHT11PIN) != DHTLIB_OK );
		setup();
	}
	delay(1000);
}

При копировании данного материала ссылка на оригинал обязательна!

#2 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 27 Октябрь 2013 - 02:28

Тот же пример, но использующий библиотеку Sleep_n0m1 https://github.com/n0m1/Sleep_n0m1
В данной библиотеке используется перевод платы в ждущий режим (вместо использования функции delay)
В ждущем режиме используется прерывание таймера (watchdog) которое возвращает плату в обычный режим.
Такой подход позволяет очень сильно понизить энергопотребление платы в режиме ожидания.
Т.е., если ограничить ток на подсветку дисплея, то можно питать плату от 4 пальчиковых батареек в течение нескольких суток, а то и больше! Если в вашем проекте не используется дисплей (или дисплей без подсветки), то и несколько месяцев! (без дисплея у меня потребляет всего 1.4 мА)
Если еще убрать регулятор напряжения с платы, то будут потребляться вообще микроамперы!!!

// include the library code:
#include <LiquidCrystal.h>
#include <dht11.h>
#include <Sleep_n0m1.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(10, 11, 12, 13, A0, A1);
int DHT11PIN = A2;
dht11 DHT11;
Sleep sleep;
////////////////////////////////////////////////////////////////////
// initialize display
// 3rd parameter is a string containing some needed russian characters from "БГДЖЗИЙЛПУФЦЧШЩЬЪЫЭЮЯ"
// up to 16 letters, but recommended not more than 8, anyway, i can use 16 on my lcd :)
////////////////////////////////////////////////////////////////////
static byte addon_letters[16];
void init_rus(const char* letters_use )
{
// custom characters
static byte letters[][8] = {
{ B11111, B10000, B10000, B11111, B10001, B10001, B11111, B00000 },//Б
{ B11111, B10000, B10000, B10000, B10000, B10000, B10000, B00000 },//Г
{ B01111, B01001, B01001, B01001, B01001, B11111, B10001, B00000 },//Д
{ B10101, B10101, B10101, B01110, B10101, B10101, B10101, B00000 },//Ж
{ B01110, B10001, B00001, B00110, B00001, B10001, B01110, B00000 },//З
{ B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 },//И
{ B10101, B10101, B10011, B10101, B11001, B10001, B10001, B00000 },//Й
{ B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000 },//Л
{ B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 },//П
{ B10001, B10001, B10001, B01111, B00001, B10001, B01110, B00000 },//У
{ B01110, B10101, B10101, B10101, B01110, B00100, B00100, B00000 },//Ф
{ B10001, B10001, B10001, B10001, B10001, B10001, B11111, B00001 },//Ц
{ B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000 },//Ч
{ B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00000 },//Ш
{ B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001 },//Щ
{ B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000 },//Ь
{ B11000, B01000, B01110, B01001, B01001, B01001, B01110, B00000 },//Ъ
{ B10001, B10001, B10001, B11101, B10101, B10101, B11101, B00000 },//Ы
{ B11110, B00001, B00001, B01111, B00001, B00001, B11110, B00000 },//Э
{ B10111, B10101, B10101, B11101, B10101, B10101, B10111, B00000 },//Ю
{ B01111, B10001, B10001, B01111, B10001, B10001, B10001, B00000 },//Я
};
static char chars[] = {'Б','Г','Д','Ж','З','И','Й','Л','П','У','Ф','Ц','Ч','Ш','Щ','Ь','Ъ','Ы','Э','Ю','Я'};
static byte empty[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
int index = 0, cl = sizeof(chars)/sizeof(char),i,j,symb;
memset(addon_letters,0,sizeof(addon_letters));
for( j = 0; j < strlen(letters_use) && j < 16; j++ )
	 lcd.createChar(j, empty);

for( j = 0; j < strlen(letters_use) && j < 16; j++ )
{
	 symb = -1;
	 for( i=0; i < cl; i++ ) if( chars[i] == letters_use[j] ) { symb = i; addon_letters[index] = letters_use[j]; break; }
	 if( symb != -1 ) { lcd.createChar(index, letters[symb]); index++; }
}
}
////////////////////////////////////////////////////////////////////
// print russian chars
////////////////////////////////////////////////////////////////////
void print_rus(char *str) {
static char rus_letters[] = {'А','В','Е','Ё','К','М','Н','О','Р','С','Т','Х'};
static char trans_letters[] = {'A','B','E','E','K','M','H','O','P','C','T','X'};
int lcount = sizeof(rus_letters)/sizeof(char), i, j;
for( i=0; i<strlen(str); i++ )
{
if( byte(str[i]) == 208 ) continue; // 208 ignore
int found = 0;
for(j=0; j < 16; j++) if( addon_letters[j] != 0 && byte(str[i]) == byte(addon_letters[j]) ) { lcd.write(j); found = 1; break; }
if(!found) for(j=0; j < lcount; j++) if( byte(str[i]) == byte(rus_letters[j]) ) { lcd.write(trans_letters[j]); found = 1; break; }
if(!found) lcd.write(byte(str[i]));
}
}
void print_rus(int x, int y, char *str) {
lcd.setCursor(x, y);
print_rus(str);
}
////////////////////////////////////////////////////////////////////
void sleep_delay(unsigned long sleepTime) {
sleep.pwrDownMode(); //set sleep mode
sleep.sleepDelay(sleepTime); //sleep for: sleepTime
}
static byte degree[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };//degree
void setup() {
//disable unneeded peripherals are USART0, TWI, SPI
ADCSRA = 0;
PRR = B00010111;
//disable BOD
MCUCR = _BV (BODS) | _BV (BODSE);
MCUCR = _BV (BODS);
lcd.begin(16, 2);
init_rus("УПЖЬЛ");
lcd.createChar(7, degree);
print_rus(0,0,"ТЕМПЕРАТУРА:");
print_rus(0,1,"ВЛАЖНОСТЬ :");
}
void loop() {
delay(100);
int response = DHT11.read(DHT11PIN);
if( response == DHTLIB_OK)
{
	 lcd.setCursor(12,0);
	 lcd.print(DHT11.temperature);
	 lcd.write(7);
	 lcd.print("C ");
	 lcd.setCursor(12,1);
	 lcd.print(DHT11.humidity);
	 lcd.print("% ");
}
else
{	
	 lcd.clear();
	 init_rus("ШИБДЧЛЖП");
	 print_rus(0,0," ОШИБКА ДАТЧИКА ");
	 print_rus(0,1," ТЕМП/ВЛАЖНОСТИ ");
	 do { sleep_delay(5000); } while( DHT11.read(DHT11PIN) != DHTLIB_OK );
	 setup();
}
sleep_delay(5000);
}


#3 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 07 Март 2014 - 19:15

При добавлении библиотек https://github.com/n0m1/Sleep_n0m1  пишет  Arduino: 1.5.5-r2 (Windows 7), Board: "Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

sketch_mar07a.ino:8: error: 'dht11' does not name a type
sketch_mar07a.ino:9: error: 'Sleep' does not name a type
sketch_mar07a.ino: In function 'void sleep_delay(long unsigned int)':
sketch_mar07a.ino:78: error: 'sleep' was not declared in this scope
sketch_mar07a.ino: In function 'void loop()':
sketch_mar07a.ino:97: error: 'DHT11' was not declared in this scope
sketch_mar07a.ino:98: error: 'DHTLIB_OK' was not declared in this scope


___________________________________________________________________________________________________________

При компиляции скетча Arduino: 1.5.5-r2 (Windows 7), Board: "Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

Using library LiquidCrystal in folder: C:\Program Files (x86)\Arduino\libraries\LiquidCrystal



C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=155 -DARDUINO_AVR_PRO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src C:\Users\-1DEB~1\AppData\Local\Temp\build3755566752231630780.tmp\sketch_mar07a.cpp -o C:\Users\-1DEB~1\AppData\Local\Temp\build3755566752231630780.tmp\sketch_mar07a.cpp.o

sketch_mar07a.ino:8: error: 'dht11' does not name a type
sketch_mar07a.ino:9: error: 'Sleep' does not name a type
sketch_mar07a.ino: In function 'void sleep_delay(long unsigned int)':
sketch_mar07a.ino:78: error: 'sleep' was not declared in this scope
sketch_mar07a.ino: In function 'void loop()':
sketch_mar07a.ino:97: error: 'DHT11' was not declared in this scope
sketch_mar07a.ino:98: error: 'DHTLIB_OK' was not declared in this scope

#4 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 07 Март 2014 - 22:13

У вас отсутствуют библиотеки DHT11 и Sleep_n0m1 либо вы их установили не туда

в выложенном архиве обе библиотеки, распакуйте их в папку libraries папки Arduino

Прикрепленные файлы

  • Прикрепленный файл  libraries.zip   5,61К   347 Количество загрузок:


#5 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 07 Март 2014 - 22:26

ОК ПОЛУЧИЛОСЬ ЗАКАЗАЛ ДАТЧИК ЖДЕМС КЛАСНАЯ ВЕЩ ПОНРАВИЛСЯ ЕЩЕ ПРОЭКТ НАРОДНЫЙ ПРОЭКТ http://narodmon.ru

#6 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 08 Март 2014 - 05:19

Для данного проекта я рекомендую датчик DHT22, так как DHT11 меряет только положительную температуру, что в российских условиях не гуд )

#7 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 24 Март 2014 - 23:32

При компиляции с вашей библиотекой также пишит


sketch_mar24a:9: error: 'dht11' does not name a type
sketch_mar24a:10: error: 'Sleep' does not name a type
sketch_mar24a.ino: In function 'void loop()':
sketch_mar24a:154: error: 'DHT11' was not declared in this scope
sketch_mar24a:155: error: 'DHTLIB_OK' was not declared in this scope

Выделяет строку  dht11 DHT11;

#8 admin

admin

    Администратор

  • Администраторы
  • 76 сообщений

Отправлено 26 Март 2014 - 00:07

После установки библиотеки Arduino перезапускали?

#9 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 27 Март 2014 - 18:01

Да перезапускал










sketch_mar27a:8: error: 'dht11' does not name a type
sketch_mar27a.ino: In function 'void loop()':
sketch_mar27a:91: error: 'DHT11' was not declared in this scope
sketch_mar27a:92: error: 'DHTLIB_OK' was not declared in this scope

#10 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 27 Март 2014 - 18:04

добавил вречную билиотку другая ошибка



sketch_mar27a.ino: In function 'void setup()':
sketch_mar27a:147: error: 'PRR' was not declared in this scope
sketch_mar27a:149: error: 'BODS' was not declared in this scope
sketch_mar27a:149: error: 'BODSE' was not declared in this scope

#11 Димон

Димон

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений

Отправлено 27 Март 2014 - 18:47

перебрав библиотеки с горем  получилось спс за скетч :)





Темы с аналогичным тегами Arduino, DHT11, Liquid Crystal, HD44780, russian, temperature, humidity, Ардуино, температура, влажность

Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 скрытых пользователей

Рейтинг@Mail.ru