Я пользуюсь программулиной lcdHd44780.exe для подготовки русских фраз. Не нужно создавать дополнительного кода для преобразований, она просто кодирует символы под индикатор. Вот, возмите: home.alexfisher.ru/prog/lcdHd44760.zip
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
const char mes[9]={161, 112, 97, 227, 121, 99, 111, 179, '\0'};
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print(mes);
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}
Binary sketch size: 2516 bytes (of a 30720 byte maximum)
Может Вы пытаетесь не в том месте сонстанту объявить?
#include <LCD3Wire.h>
#include <DallasTemperature.h>
#include <LiquidCrystalRus.h>
const int mes[9]={161, 112, 97, 227, 121, 99, 111, 179, '\0'}; //Градусов
// Arduino pins
#define LCD_LINES 2 // number of lines in your display
#define DOUT_PIN 6 // Dout pin
#define STR_PIN 5 // Strobe pin
#define CLK_PIN 4 // Clock pin
//create object to control an LCD.
LCD3Wire lcd = LCD3Wire(LCD_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
DallasTemperature tempSensor1;
// You may instantiate as many copies as you require.
char * floatToString(char * outstr, float value, int places, int minwidth, bool rightjustify);
void setup(void) {
// initialize
lcd.init();
tempSensor1.begin(7); // Data wire is plugged into pin 12 on the Arduino
}
void loop(void) {
float temp;
char buff[10];
switch(tempSensor1.isValid())
{
case 1:
Serial.println("Invalid CRC");
tempSensor1.reset(); // Attempts to redetect IC
return;
case 2:
Serial.println("Not a valid device");
tempSensor1.reset(); // Attempts to redetect IC
return;
}
temp = (tempSensor1.getTemperature());
lcd.cursorTo(2,0);
lcd.printIn(floatToString(buff,temp,3,0,false));
lcd.print(0xDF);// degree sign
//const char mes[9]={161, 112, 97, 227, 121, 99, 111, 179, '\0'}; //Градусов
lcd.print(mes);
}
Компилятор ругается
sketch_feb29a.cpp: In function 'void loop()':
sketch_feb29a:46: error: invalid conversion from 'const int*' to 'int'
sketch_feb29a:46: error: initializing argument 1 of 'void LCD3Wire::print(int)'
У меня, к сожалению, нет библиотеки LCD3Wire, но на первый взгляд, функция класса определена только как ::print(int), а определения ::print(char*) нет.Вы перед этим строковую конструкцию выводите через printIn. Попробуйте поставить
Компилятор константы определяет в программной памяти - а это другой подход. Если у Вас много сообщений, то оперативки может нехватить, Вам нужно будет располагать сообщения или в программной памяти, или в еепром, в оперативке держать только 1 буферную переменную. Ну или подправить библиотеку, чтобы она понимала вывод данных прямо из программной памяти.
Вы выводите это в цикле, следовательно, i<8, потому что '\0' выводить не надо. Сделайте лучше:
for (int i=0; mes[i]>0; i++) lcd.print(mes[i]);
А вообще, LCD3Wire какой-то ущербный по сравнению со штатным. Штатный является наследником класса Print с переопределенным методом write, поэтому спокойно может выводить все, что угодно. Надо было всего по-своему переопределить метод write (через внешний регистр) и все. А тут - новый класс, но сырой.
А вообще, LCD3Wire какой-то ущербный по сравнению со штатным - подскажите пожалуйста, что есть штатный? и если его правильней использовать, то могу и попробовать штатный...
Штатный - я имел ввиду LiquidCrystal, но эту библиотеку нужно править под "3 провода" - переписывать метод write и править инициализацию.
Другой вариант - воспользоваться методом с "робокрафта" куча устройств по 5 проводам (там и ввод и вывод через внешние регистры, поэтому 5 проводов, а не 3)
Т.к. в программирование не силен, немного подправил и пример из этой статьи работает + еще у него есть автоскролл и т.п.
Очень интересная библа! Спасибо! Поковыряюсь на досуге. Особенно понравилось использование старшего бита сдвигового регистра в качестве "enable" (минус 1 провод) и прямая работа с портами (FastIO)
Очень интересная библа! Спасибо! Поковыряюсь на досуге. Особенно понравилось использование старшего бита сдвигового регистра в качестве "enable" (минус 1 провод) и прямая работа с портами (FastIO)
а можно немного "простым" языком прокомментировать? а то я из Вашего текста совсем ничего не понял, что же вкусного такого в библиотеке
честно говоря все равно не уловил из Ваших пояснений :(
А по поводу библиотеки - мы несколкьо о разных говорим с Вами...я использую исключительно LiquidCrystal_SR_LCD3 и она тут более "полная", чем в предложеной Вами ссылке.
Сделал таки скетч с использованием LiquidCrystal_SR_LCD3 и снова уперса в те же "грабли" - кириллические символы :(
Ну ясно. Я тоже на библиотеку через эту статью набрел - она там как первоисточник указана. Я не стал вчитываться в статью - просмотрел по диагонали и ушел на первоисточник.
Пришла грандиозная идея (не хихикайте), но на заре русских кодировок мы этим способом пользовались. Кстати, и в знакогенераторе индикатора закодированы только символы, "подобных" которым нет в англиском языке.
Ну а из дельных советов, попробуйте
1 lcd.print({161, 112, 97, 227, 121, 99, 111, 179, '\0'}); //Температура
компилятор ругается...
Цитата:
или
1 lcd.print(F("Температура"));
нет - так тоже не работает...
И еще я не могу уловить...про библиотеку LiquidCrystal в описание видел, что она умеет работать по 4битам...но не получилось завести через регистр сдвига, пока только с библиотекой LiquidCrystal_SR_LCD3 все работает, НО без кириллицы
Ну а из дельных советов, попробуйте
1 lcd.print({161, 112, 97, 227, 121, 99, 111, 179, '\0'}); //Температура
компилятор ругается...
Цитата:
или
1 lcd.print(F("Температура"));
нет - так тоже не работает...
И еще я не могу уловить...про библиотеку LiquidCrystal в описание видел, что она умеет работать по 4битам...но не получилось завести через регистр сдвига, пока только с библиотекой LiquidCrystal_SR_LCD3 все работает, НО без кириллицы
Ну, ругается, потому что inline array не понимает :(
Можно так (все равно сообщения нужно где-то пачкой хранить):
Еще Вам может помочь подпрогрпмма конвертации символа, но ее нужно встраивать в print или использовать отдельно в цикле. Приводит к "расточительству" примерно 200 байт. По мне, лучше все константы определить в программе уже конвертированными (с переводом в ремарке). Вот ссылка: www.microchip.su/showpost.php
сразу незнал куда запоститься, в тему к часам или в тему к температуре, но поскольку трабла с температурой значит сюда решил.
есть вот такой скетч, найден гдето на бескрайних просторах сети...
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#define temp 10 //DS18B20 назначаем вход для датчика,в данном случае 10
OneWire oneWire(temp);
DallasTemperature sensors(&oneWire);
float tempext = 0;
int rtc[7];
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // выставляем выхода для ЖКИ
void setup()
{
sensors.begin(); // запуск датчика OneWire, в данном случае только один DS18B20
lcd.print("DS18B20 test");
// Раскомментируйте эти строки, если вы хотите установить время на старте
// RTC.stop();
// RTC.set(DS1307_SEC,0);
// RTC.set(DS1307_MIN,52);
// RTC.set(DS1307_HR,01);
// RTC.set(DS1307_DOW,6);
// RTC.set(DS1307_DATE,14);
// RTC.set(DS1307_MTH,03);
// RTC.set(DS1307_YR,12);
// RTC.start();
lcd.begin(20, 4); // указываем сколь строк и символов
pinMode(9, OUTPUT);
analogWrite(9, 50); // устанавливаем ШИМ выход
lcd.print("hello world");
delay(1000);
lcd.clear();
}
char* dayOfWeek[] = {"xxx", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu"}; // дни недели
void loop()
{
sensors.requestTemperatures(); //запрос на чтение значений всех датчиков повешинных на Arduino. в этом случае только один DS18B20
tempext=sensors.getTempCByIndex(0);
RTC.get(rtc,true);
lcd.setCursor(3,0);
printDigits(rtc[2],':');
printDigits(rtc[1],':');
printDigits(rtc[0],' ');
lcd.print(dayOfWeek[rtc[3]]);
lcd.setCursor(5,1);
printDigits(rtc[4],'/');
printDigits(rtc[5],'/');
printDigits(rtc[6],' ');
lcd.setCursor(4, 2);
lcd.print(tempext);
lcd.setCursor(0, 2);
lcd.print("Tem:");
if(tempext > 30) // Можем высвечивать сообщения о превышении температуры, в данном случае выдаёт при 30 градусах,
//также можно поддерживать температуру дороботать очень легко
{
lcd.setCursor(0, 3);
lcd.print(" ALARME !!!!!! "); // Пишем что хотим читать
delay(3000);
lcd.setCursor(0, 3);
lcd.print(" ");
}
delay(100);
}
void printDigits(int digits, char delimiter)
{
if(digits < 10) {
lcd.print('0');
}
lcd.print(digits,DEC);
lcd.print(delimiter);
}
суть здесь вопроса вот в чем. как-бы к часам притензий нет, температуру показывает, но вот последняя явно градусов на 7-8 выше чем реальная в помещении и вчастности у датчика.
чем это может быть вызвано??? датчик подключен по трехпроводной линии.
А так не захотело работать...ну и ладно, главное, что по первому варианту заработало...премного благодарен
Наверо так не работает, потому что в этом случае данные находятся в программной области, а не в памяти переменных. Если параметр в функцию передается "ByRef", то есть по ссылке, то обязательно должен лежать в переменной, а если "ByVal" - по значению, то должно быть без разницы. Нужно смотреть определение функции.
а ведь попадалась инфа о том, что к датчику следует обращаться не чаще раз в 750 млсек. ну вот и предположил поставить паузу...
Заключительный вопрос - справится библиотека сама если на улице будет менее 0 вывести "-" или нужно самому обрабатывать такой вывод?
Библиотека возвращает signed int - должно все работать.
А вместо паузы в скетче примера вывод в последовательный порт, видимо...
а ведь попадалась инфа о том, что к датчику следует обращаться не чаще раз в 750 млсек. ну вот и предположил поставить паузу...
Даташит по этому вопросу сообщает следующее:
Table 2. Thermometer Resolution Configuration
R1 R0 RESOLUTION MAX CONVERSION
(BITS) TIME
0 0 9 93.75 ms (tCONV/8)
0 1 10 187.5 ms (tCONV/4)
1 0 11 375 ms (tCONV/2)
1 1 12 750 ms (tCONV)
Подскажите пожалуйста по регистру сдвига...
т.к. хотелось бы сэкономить цифровые, а LCD занимает 6 цифровых, решил попробовать использовать регистр сдвига 74HC595
нашел готовый пример на удивление все заработало по нему, НО что же мне делать с выводом кириллических символов?
Раньше для кириллицы изспользовал библиотеку LiquidCrystalRus а вот как сейчас быть?
Я пользуюсь программулиной lcdHd44780.exe для подготовки русских фраз. Не нужно создавать дополнительного кода для преобразований, она просто кодирует символы под индикатор. Вот, возмите: home.alexfisher.ru/prog/lcdHd44760.zip
ок...попробую разобраться
Нужно вывести "Градусов" - прога переделала в [9]={0xA1, 0x70, 0x61, 0xE3, 0x79, 0x63, 0x6F, 0xB3, '\0'}; //Градусов
Как такое вывести в замен lcd.print('Градусов');
Я так делаю:
не пропускает компилятор такую конструкцию :(
У меня пропускает:
Binary sketch size: 2516 bytes (of a 30720 byte maximum)
Может Вы пытаетесь не в том месте сонстанту объявить?
такой код и у меня пропускает, но я же не могу показать
потому как я регистр сдвига использую
И что? Иницилизуйте по-своему. Главное - объявления всех констант поставить перед объявлением переменных.
Хоть бы написали, что компилятор пишет, когда "не пропускает".
кусок кода
Компилятор ругается
У меня, к сожалению, нет библиотеки LCD3Wire, но на первый взгляд, функция класса определена только как ::print(int), а определения ::print(char*) нет.Вы перед этим строковую конструкцию выводите через printIn. Попробуйте поставить
не помогло :(
а библиотеку LCD3Wire брал тут
Посмотрел. Только там не printIn, а println :)
Определено как println(char value[]) - то есть все должно пройти. Проверте свой скетч, похоже, у Вас вместо маленькой L большая i в имени функции.
И поменяйте const int на const char
И поменяйте const int на const char - поменял
lcd.println(mes); - вывожу так
Хотя касательно букв I и l например есть такая строка
и в ней 100% используется I
ругается компилятор
Я валяюсь... В библиотеке действительно буква i !!!
Попробую у себя - отпишусь.
Попробовал.
работает, если определить
Компилятор константы определяет в программной памяти - а это другой подход. Если у Вас много сообщений, то оперативки может нехватить, Вам нужно будет располагать сообщения или в программной памяти, или в еепром, в оперативке держать только 1 буферную переменную. Ну или подправить библиотеку, чтобы она понимала вывод данных прямо из программной памяти.
Кстати, и так не ругается :) :
По Вашему варианту все равно у меня не заработало, НО заработало вот так...
НО выводит - Градусов || дополнительный значек ||
Чудеса...
Вы выводите это в цикле, следовательно, i<8, потому что '\0' выводить не надо. Сделайте лучше:
А вообще, LCD3Wire какой-то ущербный по сравнению со штатным. Штатный является наследником класса Print с переопределенным методом write, поэтому спокойно может выводить все, что угодно. Надо было всего по-своему переопределить метод write (через внешний регистр) и все. А тут - новый класс, но сырой.
По такому варианту все работает как надо
А вообще, LCD3Wire какой-то ущербный по сравнению со штатным - подскажите пожалуйста, что есть штатный? и если его правильней использовать, то могу и попробовать штатный...
Штатный - я имел ввиду LiquidCrystal, но эту библиотеку нужно править под "3 провода" - переписывать метод write и править инициализацию.
Другой вариант - воспользоваться методом с "робокрафта" куча устройств по 5 проводам (там и ввод и вывод через внешние регистры, поэтому 5 проводов, а не 3)
Нашел библиотеку LCD3wires посвежее
но пример из статьи не заработал ну и мой код, который вчера "пытали" перестал работать :(
сижу вот пытаюсь понять в чем дело
Покопался - не сумел разобраться, НО нашел еще одну статью
Т.к. в программирование не силен, немного подправил и пример из этой статьи работает + еще у него есть автоскролл и т.п.
Нашел библиотеку LCD3wires посвежее
но пример из статьи не заработал ну и мой код, который вчера "пытали" перестал работать :(
сижу вот пытаюсь понять в чем дело
Покопался - не сумел разобраться, НО нашел еще одну статью
Т.к. в программирование не силен, немного подправил и пример из этой статьи работает + еще у него есть автоскролл и т.п.
Очень интересная библа! Спасибо! Поковыряюсь на досуге. Особенно понравилось использование старшего бита сдвигового регистра в качестве "enable" (минус 1 провод) и прямая работа с портами (FastIO)
Очень интересная библа! Спасибо! Поковыряюсь на досуге. Особенно понравилось использование старшего бита сдвигового регистра в качестве "enable" (минус 1 провод) и прямая работа с портами (FastIO)
а можно немного "простым" языком прокомментировать? а то я из Вашего текста совсем ничего не понял, что же вкусного такого в библиотеке
а можно немного "простым" языком прокомментировать? а то я из Вашего текста совсем ничего не понял, что же вкусного такого в библиотеке
:)
"Простым" языком:
1. Понравилось, как автор извернулся с резистором и диодом и сэкономил одну ногу андурино
2. "Ногами дергает" через специальную библиотеку, которая работает быстрее
3. В библиотеках все подробно расписано и есть примеры.
Библиотеку взял из первоисточника (вчера обновилась) bitbucket.org/fmalpartida/new-liquidcrystal/downloads/LiquidCrystal_v1.2.0.zip
честно говоря все равно не уловил из Ваших пояснений :(
А по поводу библиотеки - мы несколкьо о разных говорим с Вами...я использую исключительно LiquidCrystal_SR_LCD3 и она тут более "полная", чем в предложеной Вами ссылке.
Сделал таки скетч с использованием LiquidCrystal_SR_LCD3 и снова уперса в те же "грабли" - кириллические символы :(
Сейчас вывод делаю так
Ну ясно. Я тоже на библиотеку через эту статью набрел - она там как первоисточник указана. Я не стал вчитываться в статью - просмотрел по диагонали и ушел на первоисточник.
как мне преодалеть
в кириллическое "Температура" - пробовал поэксперементировать с программой, которые Вы мне как то указывали - не получилось :(
А что за функция F() ?
не знаю :( но в примере была, и я решил не умничить и применить ее...попробовал без нее - тоже все работает
только вот как все же кирилличе5ские вывести - пока не нашел...
Пришла грандиозная идея (не хихикайте), но на заре русских кодировок мы этим способом пользовались. Кстати, и в знакогенераторе индикатора закодированы только символы, "подобных" которым нет в англиском языке.
То есть
прокатит :)
Ну а из дельных советов, попробуйте
или
1 lcd.print({161, 112, 97, 227, 121, 99, 111, 179, '\0'}); //Температура
компилятор ругается...
1 lcd.print(F("Температура"));
нет - так тоже не работает...
И еще я не могу уловить...про библиотеку LiquidCrystal в описание видел, что она умеет работать по 4битам...но не получилось завести через регистр сдвига, пока только с библиотекой LiquidCrystal_SR_LCD3 все работает, НО без кириллицы
1 lcd.print({161, 112, 97, 227, 121, 99, 111, 179, '\0'}); //Температура
компилятор ругается...
1 lcd.print(F("Температура"));
нет - так тоже не работает...
И еще я не могу уловить...про библиотеку LiquidCrystal в описание видел, что она умеет работать по 4битам...но не получилось завести через регистр сдвига, пока только с библиотекой LiquidCrystal_SR_LCD3 все работает, НО без кириллицы
Ну, ругается, потому что inline array не понимает :(
Можно так (все равно сообщения нужно где-то пачкой хранить):
Или так:
Еще Вам может помочь подпрогрпмма конвертации символа, но ее нужно встраивать в print или использовать отдельно в цикле. Приводит к "расточительству" примерно 200 байт. По мне, лучше все константы определить в программе уже конвертированными (с переводом в ремарке). Вот ссылка: www.microchip.su/showpost.php
сразу незнал куда запоститься, в тему к часам или в тему к температуре, но поскольку трабла с температурой значит сюда решил.
есть вот такой скетч, найден гдето на бескрайних просторах сети...
суть здесь вопроса вот в чем. как-бы к часам притензий нет, температуру показывает, но вот последняя явно градусов на 7-8 выше чем реальная в помещении и вчастности у датчика.
чем это может быть вызвано??? датчик подключен по трехпроводной линии.
Можно так (все равно сообщения нужно где-то пачкой хранить):
Вот так работает...спасибо огромное
Или так:
Или так:
Наверо так не работает, потому что в этом случае данные находятся в программной области, а не в памяти переменных. Если параметр в функцию передается "ByRef", то есть по ссылке, то обязательно должен лежать в переменной, а если "ByVal" - по значению, то должно быть без разницы. Нужно смотреть определение функции.
to AlexFisher - да ладно давай замнем...ведь работает по первому варианту - я доволен вполне..
Да это понятно, просто описание "граблей" должно быть по возможности подробным, чтобы другие могли их вовремя узнать в лицо и не наступать :)
Я бы лучше порекомендовал бы в некий FAQ или тому подобное включить твою софтинку - lcdHd44780.exe
Это не моя софтина, я ее где-то накопал на Казусе, кажется, но софтина полезная, конечно.
Нашел код у меня заработал с датчиком ds1820. Теперь охота сделать фунционал на определенную температуру
не нашел на форуме, как изменить формат вывода показаний с датчика. Хочу убрать 100е и 10е
lcd.print(temp,0);