Русские символы LCD 5110

Droni
Offline
Зарегистрирован: 12.10.2014

gppsoft пишет:

Droni пишет:

На сколько я разобрался в теме это и не получится с русскими. Т.к. они в чип компилятся не как

printString("Привет!",0,1,7);

а как 

printString("\xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82!",0,1,7);

каждая русская буква кодируется двумя байтами в кодировка UTF8, а данный скретч предполагает ASCII кодировку.

Все равно крякозябры.

попробуй вот это

printString("\x8F\xE0\xAE\xA2\xA5\xE0\xAA\xA0\x20\xA4\xA8\xE1\xAF\xAB\xA5\xEF!",0,1,7);

 

gppsoft
Offline
Зарегистрирован: 13.10.2014

Droni пишет:

gppsoft пишет:

Droni пишет:

На сколько я разобрался в теме это и не получится с русскими. Т.к. они в чип компилятся не как

printString("Привет!",0,1,7);

а как 

printString("\xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82!",0,1,7);

каждая русская буква кодируется двумя байтами в кодировка UTF8, а данный скретч предполагает ASCII кодировку.

Все равно крякозябры.

попробуй вот это

printString("\x8F\xE0\xAE\xA2\xA5\xE0\xAA\xA0\x20\xA4\xA8\xE1\xAF\xAB\xA5\xEF!",0,1,7);

P.S: Как спойлер добавить? Не смог найти. :(

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отправь просто 

printString("Привет!",0,1,7);

глянуть что именно выдаст и по картинке определить на какие элементы массива он ссылается

и фото бы покачественней. хоть через темное стекло или пленку

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вот вы тут опять обсуждаете задачу с русскими буквами - в скетче и в микроконтроллере, а я тут уже давно решил эту задачу. И, к вашему сведенью, памяти строки меньше займут в 2 раза!

Droni
Offline
Зарегистрирован: 12.10.2014

NeiroN пишет:

Вот вы тут опять обсуждаете задачу с русскими буквами - в скетче и в микроконтроллере, а я тут уже давно решил эту задачу. И, к вашему сведенью, памяти строки меньше займут в 2 раза!

Это хорошо. Но будет ли ваш вариант работать с Visual Studio и Visual Micro под нее?

serghv
Offline
Зарегистрирован: 13.10.2014

Всех приветствую господа. В общем я победил эту проблемму. Библиотека PCD8544. Подправил файл Charset.cpp:

/*
 * PCD8544 - Interface with Philips PCD8544 (or compatible) LCDs.
 *
 * Copyright (c) 2010 Carlos Rodrigues <cefrodrigues@gmail.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */


#include <avr/pgmspace.h>


// The 7-bit ASCII character set...
const PROGMEM unsigned char charset[][5] = {
  { 0x00, 0x00, 0x00, 0x00, 0x00 },  // 20 space
  { 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 backslash 
  { 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 ~
  { 0x00, 0x00, 0x00, 0x00, 0x00 },  // 7f
   { 0x7C, 0x14, 0x14, 0x14, 0x08 },//p        0xB0
        { 0x38, 0x44, 0x44, 0x44, 0x20 },//c        0xB1
        { 0x04, 0x04, 0x7c, 0x04, 0x04 },//т        0xB2
        { 0x0C, 0x50, 0x50, 0x50, 0x3C },//у        0xB3
        { 0x30, 0x48, 0xfc, 0x48, 0x30 },//ф        0xB4
        { 0x44, 0x28, 0x10, 0x28, 0x44 },//x        0xB5
        { 0x7c, 0x40, 0x40, 0x40, 0xfc },//ц        0xB6
        { 0x0c, 0x10, 0x10, 0x10, 0x7c },//ч        0xB7
        { 0x7c, 0x40, 0x7c, 0x40, 0x7c },//ш        0xB8
        { 0x7c, 0x40, 0x7c, 0x40, 0xfc },//щ        0xB9
        { 0x04, 0x7c, 0x50, 0x50, 0x20 },//ъ        0xBA
        { 0x7c, 0x50, 0x50, 0x20, 0x7c },//ы        0xBB
        { 0x7c, 0x50, 0x50, 0x20, 0x00 },//ь        0xBC
        { 0x28, 0x44, 0x54, 0x54, 0x38 },//э        0xBD
        { 0x7c, 0x10, 0x38, 0x44, 0x38 },//ю        0xBE
        { 0x08, 0x54, 0x34, 0x14, 0x7c}, //я        0xBF
		
		
		
  { 0x7e, 0x11, 0x11, 0x11, 0x7e },//A        0x80    
      { 0x7f, 0x49, 0x49, 0x49, 0x33 },//Б        0x81    
        { 0x7f, 0x49, 0x49, 0x49, 0x36 },//В        0x82    
        { 0x7f, 0x01, 0x01, 0x01, 0x03 },//Г        0x83    
        { 0xe0, 0x51, 0x4f, 0x41, 0xff },//Д        0x84    
        { 0x7f, 0x49, 0x49, 0x49, 0x41 },//E        0x85    
        { 0x77, 0x08, 0x7f, 0x08, 0x77 },//Ж        0x86    
        { 0x41, 0x49, 0x49, 0x49, 0x36 },//З        0x87    
        { 0x7f, 0x10, 0x08, 0x04, 0x7f },//И        0x88    
        { 0x7c, 0x21, 0x12, 0x09, 0x7c },//Й        0x89    
        { 0x7f, 0x08, 0x14, 0x22, 0x41 },//K        0x8A    
        { 0x20, 0x41, 0x3f, 0x01, 0x7f },//Л        0x8B    
        { 0x7f, 0x02, 0x0c, 0x02, 0x7f },//M        0x8C    
        { 0x7f, 0x08, 0x08, 0x08, 0x7f },//H        0x8D    
        { 0x3e, 0x41, 0x41, 0x41, 0x3e },//O        0x8E    
        { 0x7f, 0x01, 0x01, 0x01, 0x7f },//П        0x8F    
        { 0x7f, 0x09, 0x09, 0x09, 0x06 },//P        0x90    
        { 0x3e, 0x41, 0x41, 0x41, 0x22 },//C        0x91
        { 0x01, 0x01, 0x7f, 0x01, 0x01 },//T        0x92
        { 0x47, 0x28, 0x10, 0x08, 0x07 },//У        0x93
        { 0x1c, 0x22, 0x7f, 0x22, 0x1c },//Ф        0x94
        { 0x63, 0x14, 0x08, 0x14, 0x63 },//X        0x95
        { 0x7f, 0x40, 0x40, 0x40, 0xff },//Ц        0x96
        { 0x07, 0x08, 0x08, 0x08, 0x7f },//Ч        0x97
        { 0x7f, 0x40, 0x7f, 0x40, 0x7f },//Ш        0x98
        { 0x7f, 0x40, 0x7f, 0x40, 0xff },//Щ        0x99
        { 0x01, 0x7f, 0x48, 0x48, 0x30 },//Ъ        0x9A
        { 0x7f, 0x48, 0x30, 0x00, 0x7f },//Ы        0x9B
        { 0x00, 0x7f, 0x48, 0x48, 0x30 },//Э        0x9C
        { 0x22, 0x41, 0x49, 0x49, 0x3e },//Ь        0x9D
        { 0x7f, 0x08, 0x3e, 0x41, 0x3e },//Ю        0x9E
        { 0x46, 0x29, 0x19, 0x09, 0x7f },//Я        0x9F
// маленькие буквы
        { 0x20, 0x54, 0x54, 0x54, 0x78 },//a        0xA0
        { 0x3c, 0x4a, 0x4a, 0x49, 0x31 },//б        0xA1
        { 0x7c, 0x54, 0x54, 0x28, 0x00 },//в        0xA2
        { 0x7c, 0x04, 0x04, 0x04, 0x0c },//г        0xA3
        { 0xe0, 0x54, 0x4c, 0x44, 0xfc },//д        0xA4
        { 0x38, 0x54, 0x54, 0x54, 0x18 },//e        0xA5
        { 0x6c, 0x10, 0x7c, 0x10, 0x6c },//ж        0xA6
        { 0x44, 0x44, 0x54, 0x54, 0x28 },//з        0xA7
        { 0x7c, 0x20, 0x10, 0x08, 0x7c },//и        0xA8
        { 0x7c, 0x41, 0x22, 0x11, 0x7c },//й        0xA9
        { 0x7c, 0x10, 0x28, 0x44, 0x00 },//к        0xAA
        { 0x20, 0x44, 0x3c, 0x04, 0x7c },//л        0xAB
        { 0x7c, 0x08, 0x10, 0x08, 0x7c },//м        0xAC
        { 0x7c, 0x10, 0x10, 0x10, 0x7c },//н        0xAD
        { 0x38, 0x44, 0x44, 0x44, 0x38 },//o        0xAE
        { 0x7c, 0x04, 0x04, 0x04, 0x7c }//п        0xAF
       
		 
};


/* vim: set expandtab ts=4 sw=4: */

Здесь пришлось в массиве поменять местами порядок русских букв. Но все равно только редактированием этого файла не обойтись.

В файле PCD8544.cpp делаем правки

size_t PCD8544::write(uint8_t chr)
#endif
{
    // ASCII 7-bit only...
    if (chr >= 0x80) {
#if ARDUINO < 100
        return;
#else
        return 0;
#endif
    }

ЗАМЕНЯЕМ НА 
size_t PCD8544::write(uint8_t chr)
#endif
{
    // ASCII 7-bit only...
    if (chr >= 0xC0) {
#if ARDUINO < 100
        return;
#else
        return 0;
#endif
    }

И все работает. Библиотека более простая чем АрдаФруит. позволяет выводить картинки и спецсимволы. Единственное, что не удалось побороть- размер шрифта.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

размер шрифта побороть можно 3 способами

1. масштабировать текущий шрифт. выглядит убого и множитель только целый

2. сделать новый шрифт кратный высоте строки (8пикселей)

3. делать массив для всего дисплея. в нем писать в любом месте и как угодно, и выводить его на дисплей. что то вроде видеопамяти. только жрет оперативку сильно

serghv
Offline
Зарегистрирован: 13.10.2014

jeka_tm 

По первому варианту-в библиотеке PCD8544 вроде такой функции нету.

2.Вариант не осилю))) Тем более текущий шрифт итак высотой 8 пикселей. Мне нужно около 16-32. 

Единственный вариант который мне видится-выводить картинками. Ввиду того, что слов и букв будет не много то можно будет нарисовать целиком слово. А вот с цифрами посложнее, т.к. они будут меняться динамически. Но памяти сожрет прилично.

Droni
Offline
Зарегистрирован: 12.10.2014

serghv пишет:

2.Вариант не осилю))) Тем более текущий шрифт итак высотой 8 пикселей. Мне нужно около 16-32. 

а повзаимствовать из keyrus не? Там стандартные вполне себе шрифты. http://gurtjak.skif.net/pages/programs.htm

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Droni пишет:

Это хорошо. Но будет ли ваш вариант работать с Visual Studio и Visual Micro под нее?

Если вы компилите в других IDE то и настраивайте там какую вам надо кодировку скетча. Или там(у мелкомягких) не знают что может потребоваться кодировка отличная от юникода? 

Electric_62
Offline
Зарегистрирован: 22.02.2015

Вот отредактированная мной библиотека Adafruit_GFX с поддержкой русских букв

https://yadi.sk/d/MEiPGeXcepeJK

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Electric_62 пишет:

Вот отредактированная мной библиотека Adafruit_GFX с поддержкой русских букв

https://yadi.sk/d/MEiPGeXcepeJK

 С буквой "И" какой-то косяк. Вместо неё знак вопроса.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

serghv пишет:

jeka_tm 

По первому варианту-в библиотеке PCD8544 вроде такой функции нету.

2.Вариант не осилю))) Тем более текущий шрифт итак высотой 8 пикселей. Мне нужно около 16-32. 

Единственный вариант который мне видится-выводить картинками. Ввиду того, что слов и букв будет не много то можно будет нарисовать целиком слово. А вот с цифрами посложнее, т.к. они будут меняться динамически. Но памяти сожрет прилично.

цифры могу дать. в этой теме посмотри какие

http://arduino.ru/forum/proekty/khronograf-izmeritel-skorosti-puli-ot-pr...

а новые можно в одной программе генерировать

http://arduino.ru/forum/proekty/khronograf-izmeritel-skorosti-puli-ot-pr...

только там замороченный вывод. но его уже победил. код выложил

Electric_62
Offline
Зарегистрирован: 22.02.2015

sandr4 пишет:

С буквой "И" какой-то косяк. Вместо неё знак вопроса.

Странно. Еще раз проверил все буквы. Все работает.

Выложи код. Может быть вместе найдем косяк.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Вот в шрифте строка:   0x7f, 0x10, 0x08, 0x04, 0x7f,//И 0x98

 
Electric_62
Offline
Зарегистрирован: 22.02.2015

sandr4 пишет:

Вот в шрифте строка:   0x7f, 0x10, 0x08, 0x04, 0x7f,//И 0x98

Здесь все верно))

Может быть в твоем скетче ошибка?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Как мне правильно определить строковую переменную и вывести её на дисплей? Пытаюсь так:

String variant
if(<кусок кода>){
variant="строка";
display.print(variant);

На дисплей ни чего не выводит.

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

А вот скетч:

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
 
void setup() {
  display.begin();
  display.setContrast(55);
  }
 
 void loop() {
  display.clearDisplay();
  display.setTextSize(1);// В строку вмещается 14 знаков
  display.print("АБВГДЕЖЗИЙКЛМН");
  display.setTextSize(2);// В строку вмещается 7 знаков
  display.print("опрстуф");
  display.setTextSize(3);// В строку вмещается 4 знаков
  display.print("цщшя");
  display.display();
}

 

Electric_62
Offline
Зарегистрирован: 22.02.2015

sandr4 пишет:

Как мне правильно определить строковую переменную и вывести её на дисплей? Пытаюсь так:

String variant
if(<кусок кода>){
variant="строка";
display.print(variant);

На дисплей ни чего не выводит.

Добавь в конец кода строчку:

display.display();

У меня так переменная выводится.

Возможно другая информация затирает твою переменную. Может это поможет:

display.setCursor(0,0); // Устанавливаем курсор в нужную колонку и строку

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015
Есть такая строка. Дело в том что остальную информацию выводит, а именно переменную не хочет.
И ещё вопрос. Как записать время в DS1307. Питание снимаешь - они останавливаются.

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Что делаю не правильно?:


#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием

Time t; // Инициализация структуры 
//String str1;
char* str[]={"Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"};
int i;

void setup()
{
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  rtc.setDOW(6);        // Установка дня недели
  rtc.setTime(8, 8, 10);  // Установка времени 10:59:10 
  rtc.setDate(28, 02, 2015);   // Установка даты 20 июля 2013
  
  if((rtc.getDOWStr())=="MONDAY"){
    i=0; 
    str[i];} 
   else
  if((rtc.getDOWStr())=="TUESDAY"){
    i=1;
    str[i];}
   else
  if((rtc.getDOWStr())=="WEDNESDAY"){
    i=2;
    str[i];}
  else
  if((rtc.getDOWStr())=="THORSDAY"){
    i=3;
    str[i];}
 else
  if((rtc.getDOWStr())=="FRIDAY"){
    i=4;
    str[i];}
 else
  if((rtc.getDOWStr())=="SATURDAY"){
    i=5;
    str[i];}
 else
  if((rtc.getDOWStr())=="SUNDAY"){
    i=6;
    str[i];}
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(2); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10){
    display.setCursor(7,0);
    display.print("0");
    display.setCursor(20,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(7,0);
    display.print(t.hour);}
    
    display.setCursor(35,0);
    display.print("-");
    
  if(int(t.min)<10){
    display.setCursor(49,0);
    display.print("0");
    display.setCursor(63,0);
    display.print(int(t.min));} // Вывод минут  
  else{  
    display.setCursor(49,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(35, 0);
    display.print("0");
    display.setCursor(41, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(35, 0); 
    display.print((t.sec));} // Вывод секунд
    
  display.setCursor(8,17);
  display.print(str[i]); // Вывод дня недели

  display.setCursor(13,27);
  display.print(rtc.getDateStr()); // Вывод даты
  display.setTextSize(1); // Установка набора символов
  display.setCursor(0, 37);
  display.print("часы от sandr4");
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
}

 Всё равно выводит "Понедельник".

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так может у тебя понедельник. что ты железку ругаешь))

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

У меня вообще отпуск, а в 28 строке задаю субботу, а он, собака, пишет понедельник. Вот и спрашивается, где косяк?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а если сделать так

Serial.println(rtc.getDOWStr());

и посмотреть что он выдает. может это не он тупит, а кто то перегрелся на солнышке

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

что выполняет строка 034 str[i];}   ?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Как я понимаю, если "MONDEY", то в "i" заносится "0", если "TUESDAY", то в "i" заносится "1" и так далее...

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

jeka_tm пишет:

а если сделать так

Serial.println(rtc.getDOWStr());

и посмотреть что он выдает. может это не он тупит, а кто то перегрелся на солнышке

Я понял, что выполняется только "MONDAY", вот и спрашиваю, что не так? Я раньше писал на Delphi, совсем другая петрушка...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну проверь чтоли уже)) вставь строку в свой код и посмотри в терминале

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Пишет субботу...А на дисплей выводит понедельник.

И часы отстают не по детски...Батарейка?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

sandr4 пишет:
Как я понимаю, если "MONDEY", то в "i" заносится "0", если "TUESDAY", то в "i" заносится "1" и так далее...

это соответствие устанавливается в строке 33, а в 34-й вообще смысла не вижу.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Немного переделал, но всё равно возвращает "0". Не пойму что не так:

  int work_day(){
  rtc.getTime();
  
  if((rtc.getDOWStr())=="MONDAY")    return d=0;  
  else
  if((rtc.getDOWStr())=="TUESDAY")   return d=1;
  else
  if((rtc.getDOWStr())=="WEDNESDAY") return d=2;
  else
  if((rtc.getDOWStr())=="THORSDAY")  return d=3;
  else
  if((rtc.getDOWStr())=="FRIDAY")    return d=4;
  else
  if((rtc.getDOWStr())=="SATURDAY")  return d=5;
  else
  if((rtc.getDOWStr())=="SUNDAY")    return d=6;
}

  work_day;
  display.print(str[d]); // Вывод дня недели
  Serial.println(d);
  Serial.println(rtc.getDOWStr());

 

Electric_62
Offline
Зарегистрирован: 22.02.2015

sandr4 пишет:

Немного переделал, но всё равно возвращает "0". Не пойму что не так:

У тебя в коде ошибки и пропущено много скобок {}

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

case не может быть строковым, только числом.

sandr4, у тебя после строки 01 программа всегда перескакивает на строку 19. Сам найдешь ошибку? :)

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Если-бы мог сам найти ошибку, здесь бы не задавал вопроса.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

У тебя d всегда равна нулю, потому что ни в одной строчке кода ты не меняешь ее состояние (я про пост #81).

Попробуй так:

byte work_day()  // функция должна быть вынесена за пределы скобок loop или setup
{
  rtc.getTime();    
  if((rtc.getDOWStr())=="MONDAY")    return 0;  
  else
    if((rtc.getDOWStr())=="TUESDAY")   return 1;
    else
      if((rtc.getDOWStr())=="WEDNESDAY") return 2;
      else
        if((rtc.getDOWStr())=="THORSDAY")  return 3;
        else
          if((rtc.getDOWStr())=="FRIDAY")    return 4;
          else
            if((rtc.getDOWStr())=="SATURDAY")  return 5;
            else
              if((rtc.getDOWStr())=="SUNDAY")    return 6;
}

void loop()
{  
  byte d = work_day();
  Serial.println(str[d]); // Вывод дня недели
  Serial.println(d);
  delay(1000);
  Serial.println(rtc.getDOWStr());
}

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Спасибо за помощь, вставил Ваш код в прогу, возвращает, почему-то, "31"...

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

возвращает в каком месте? d не может быть 31.

Весь код выложите, у меня нет DS1307, плоэтому вживую проверить нет возможности.

P.S.  и исправьте THORSDAY

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Весь код:

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием

Time t; // Инициализация структуры 
//String str1;
char* str[]={"Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"};
int d;

void setup()
{
  Serial.begin(9600);
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(2); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10){
    display.setCursor(9,0);
    display.print("0");
    display.setCursor(22,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(9,0);
    display.print(t.hour);}
    
    display.setCursor(37,0);
    display.print("-");
    
  if(int(t.min)<10){
    display.setCursor(51,0);
    display.print("0");
    display.setCursor(65,0);
    display.print(int(t.min));} // Вывод минут  
  else{  
    display.setCursor(51,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(37, 0);
    display.print("0");
    display.setCursor(43, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(37, 0); 
    display.print((t.sec));} // Вывод секунд
    
  display.setCursor(8,17);
  byte d = work_day();
  display.print(str[d]);
  Serial.println(str[d]); // Вывод дня недели
  Serial.println(d);
  Serial.println(rtc.getDOWStr());

  display.setCursor(13,27);
  display.print(rtc.getDateStr()); // Вывод даты
  display.setTextSize(1); // Установка набора символов
  display.setCursor(25, 37);
  display.print("здесь t");
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
}
byte work_day()  // функция должна быть вынесена за пределы скобок loop или setup
{
  rtc.getTime();    
  if((rtc.getDOWStr())=="MONDAY")    return 0;  
  else
    if((rtc.getDOWStr())=="TUESDAY")   return 1;
    else
      if((rtc.getDOWStr())=="WEDNESDAY") return 2;
      else
        if((rtc.getDOWStr())=="THURSDAY")  return 3;
        else
          if((rtc.getDOWStr())=="FRIDAY")    return 4;
          else
            if((rtc.getDOWStr())=="SATURDAY")  return 5;
            else
              if((rtc.getDOWStr())=="SUNDAY")    return 6;
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а где "31" выводится?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

"31" в мониторе, на дисплее, соответственно, пустота.

  Serial.println(str[d]);                           // в мониторе здесь пустота
  Serial.println(d);                                // здесь 31
  Serial.println(rtc.getDOWStr());                  // здесь SUNDAY

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

упс

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Сделал так:

char* str[]={"Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"};
String d;
...............................
String d = rtc.getDOWStr();
    if(d == "Monday"){d=(str[0]);display.print(d);}
    else
     if(d == "Tuesday"){d=(str[1]);display.print(d);}
     else
       if(d == "Wednesday"){d=(str[2]);display.print(d);}
       else
         if(d == "Thursday"){d=(str[3]);display.print(d);}
         else
           if(d == "Friday"){d=(str[4]);display.print(d);}
           else
             if(d == "Saturday"){d=(str[5]);display.print(d);}
             else
               if(d == "Sunday"){d=(str[6]);display.print(d);}

 и код "заработал". Теперь дни недели на русском.

 

alev05
Offline
Зарегистрирован: 01.02.2015

составь символы таким форматом:

byte symvol_a[] = {

B0,0,0,0,0

B0,0,1,0,0

B0,1,0,1,0

B0,1,1,1,0

B0,1,0,1,0

B0,1,0,1,0

B0,0,0,0,0

}

будет отоброжаца символ А .

в принцепе можно английскую букву "a". Ну вы меня поняли.

Только я не понял как его запустить.

 

zvyagaaa
Offline
Зарегистрирован: 31.05.2015

Добрый день, уважаемое сообщество.

Тоже пытаюсь соединить дисплей от Nokia 5110 с Arduino Uno.

Для этого использую библиотеку https://github.com/carlosefr/pcd8544 с патчем и шрифтом от serghv.

В коде, если писать

lcd.print("Привет!");

то отображается на экране все нормально: Привет!

А если передавать из COM-порта - то английские буквы показывает нормально - русские нет.

Я использую следующий код для передачи информации из компьютера в экранчик:

String s

while (Serial.available())    
    {
      char c = Serial.read();  
      s += c;                     
      if (c == '\n')      //перевод строки        
        {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(s);
    }
   

Пробую так же подключиться из Delphi к ардуино. Чувствую, что проблема просто с кодировкой. Однако, если делать кодировку UTF8 для передачи, то английский передается нормально, русский нет. Вообще не показывается на экране.

Хочу сделать нотификатор из гугл календаря на связке Ардуино - Дельфи.

Droni
Offline
Зарегистрирован: 12.10.2014

Никакого utf8 только ascii

zvyagaaa
Offline
Зарегистрирован: 31.05.2015

Да, вы правы!

Если попросить вывести хекс вместо символа на экран кодом

display.print(Serial.read(),HEX);

то выводятся коды кодировки СР1251, т.е. вместо А - C0, вместо а - E0. Тогда в чем может быть проблема? В таблице символов?

Как исправить?

Droni
Offline
Зарегистрирован: 12.10.2014

zvyagaaa пишет:

Как исправить?

ну в вашем случае: найти/настроить терминал на ascii.

Вы же передаете из винды или по блютузу? Кто является источником?

zvyagaaa
Offline
Зарегистрирован: 31.05.2015

источником сейчас является монитор последовательного порта из IDE Arduino для Windows. Так что меня смущает, что код-то передается тот, что нужно, в  кодировке СР1251, см. мое предыдущее сообщение, а на экране не отображается.

Droni
Offline
Зарегистрирован: 12.10.2014

https://ru.wikipedia.org/wiki/Windows-1251

Попробуй конвертить из CP1251 в расширенный ASCII

Droni
Offline
Зарегистрирован: 12.10.2014

хм... туплю - это одно и тоже. Тогда надо смотреть как руссифицирован шрифт, возможно не по стандату