помогите с lcd 1602 и другие вопросы
- Войдите на сайт для отправки комментариев
Втр, 25/04/2017 - 23:08
Здравствуйте.
Все сначала раскажу) В машину хочу сделать как бы мини бортового с функциями: температура газа, темп. двигателя , вольтметр, часы, пока все , а там посмотрим...
вот что пока не нравиться:
1. при работе lcd идут моржки надписей , как бы обновления данных с датчиков , как можно устранить?
2. как значение температы округлить к целому числу, точнее сделать просто целое число? вольтметр к десятым ?
пока так, дальше учусь))
Вот что накопировал))
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD }; // адрес датчика DS18B20 28FFAADBA21604CD
DeviceAddress Thermometer2 = {0x28, 0xFF, 0xF3, 0x4A, 0xA3, 0x16, 0x05, 0x30 }; // 28FFF34AA3160530
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x3f, 16, 2);
int analogInput = A6; //вход для вольтметра
float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ
void setup()
{
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.setCursor(2, 0);
lcd.print(L"Мир земляни!");
delay(400);
pinMode(analogInput, INPUT);
}
void loop()
{
sensors.requestTemperatures();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(L"");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print(L"");
lcd.print(sensors.getTempCByIndex(1));
lcd.print("C");
lcd.setCursor(11, 1);
vin = float(analogRead(analogInput))/196; //подстроичное число для показа вольтметра
lcd.print("");
lcd.print(vin);
lcd.print("v");
}
вот видео как моргает
https://www.youtube.com/watch?v=OGENUtyNSM4
31//lcd.init();32//lcd.backlight();вот так и думал, походу идет какоето постоянное обновление, спс работает)))
void setup() { lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.setCursor(2, 0); lcd.print(L"Мир земляни!"); delay(1000); lcd.clear(); pinMode(analogInput, INPUT); /// можно убрать }да, так и сделал)) спс.
2. как значение температы округлить к целому числу, точнее сделать просто целое число? вольтметр к десятым ?
lcd.print(vin, 1);
String formatVolt(float volt) { int precision = 1; // количество знаков после запятой int whole = (int)volt; int fractional = (int)(( volt - floor(volt)) * pow(10, precision) ); return String(whole)+"."+String(fractional)+"v"; }а чтоб дисплей не моргал делал так:
struct Disp { String s1; String s2;}; Disp Display; //двухстрочный массив для вывода на экран Disp lastDisplay; //если строки изменились то выводим на экран void loop() { ................... //например Display.s1 = "T="+String(round(sensor.getTempCByIndex(0))))+"C"; Display.s2 = "U="+formatVolt(analogRead(pinVolt); ...................... if (Display.s1.compareTo(lastDisplay.s1)!=0) {lcd.setCursor(0,0); lcd.print(Display.s1); lastDisplay.s1 = Display.s1;} if (Display.s2.compareTo(lastDisplay.s2)!=0) {lcd.setCursor(0,1); lcd.print(Display.s2); lastDisplay.s2 = Display.s2;} }все получилось, всем спасибо!!) буду дальше что-то мудрувать))
C:\Users\1\AppData\Local\Temp\Rar$DIa0.033\CO2_1602_I2C\CO2_1602_I2C.ino: In function 'void get_co2()':
expected ';' before 'cd'
помогите с ошибкой
C:\Users\1\AppData\Local\Temp\Rar$DIa0.033\CO2_1602_I2C\CO2_1602_I2C.ino: In function 'void get_co2()':
expected ';' before 'cd'
помогите с ошибкой
верните l на место )))
Компилятор говорит перед строчкой cd.setCursor(0, 1); горе-программист потерял ;
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>;
#include <Encoder.h>
#include "Timer.h"
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT_Unified dht(DHTPIN, DHTTYPE);
unsigned char response[9];
int hum;
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define ENCODER_DO_NOT_USE_INTERRUPTS
Encoder myEnc(2, 3); //подключение энкодера
int flag=0;
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
dht.begin();
sensor_t sensor;
digitalWrite(7,HIGH);
// инициализация LCD
lcd.begin();
lcd.backlight();
t.every(15000, get_co2);
t.every(2000, get_temp);
}
long criticalppm = -999;
{
t.update();
if (newppm != criticalppm) {
criticalppm = newppm;
lcd.setCursor(0, 1);
lcd.print(" ");
}
lcd.setCursor(0, 1);
lcd.print("CO2=");lcd.print(ppm);
lcd.setCursor(10, 1);
lcd.print("V:");lcd.print(criticalppm);
lcd.print("T=");lcd.print(tem);lcd.print(" C");
lcd.setCursor(9, 0);
lcd.print("H=");lcd.print(hum);lcd.print(" %");
digitalWrite(7,LOW);
else digitalWrite(7,HIGH);
}
//=================================================
void get_co2()
{
mySerial.write(cmd, 9);
memset(response, 0, 9);
mySerial.readBytes(response, 9);
int i;
byte crc = 0;
for (i = 1; i < 8; i++) crc+=response[i];
crc = 255 - crc;
crc++;
Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
} else {
unsigned int responseHigh = (unsigned int) response[2];
unsigned int responseLow = (unsigned int) response[3];
ppm = (256*responseHigh) + responseLow;
Serial.println(ppm);
lcd.print(" ");
}
}
//=================================================
void get_temp(){
sensors_event_t event;
dht.temperature().getEvent(&event);
tem=event.temperature;
dht.humidity().getEvent(&event);
hum=event.relative_humidity;
lcd.setCursor(0, 0);
lcd.print(" ");
}
вроде так и написанно
1 cd.setCursor(0, 1);
1 cd.setCursor(0, 1);
ну нах 1.
напиши просто cd.setCursor(0, 1); / но скорее всего lcd.setCursor(0, 1);
А компилятор говорит. если горе программист втулил зачем-то 1, то надо воткнуть и ;
Спасибо помогло....правильно lcd
здраствуйте всем!!!
обратно нужна ваша помощь)
написал, ну как написал, накопировал скетч который выводит на екран температуру, вольтметр, часы (блок реального времени), включен или выключен газ. все вроди работает но есть одно но. Ранее был написан скетч для пульта магнитолы и 3 месяца была практика, которая показала отличий функционал. И вот установил экран в авто и соединив 2 скетча в 1 вылезли некоторые косяки, а именно не кожное нажатие отрабатываеться (особенно громкость), время сежду нажатиями.
Подскажите как можно избавиться от этих косяков или как упростить скетч чтоб уменьшить цикл.
зарание спасибо))
#include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include "RTClib.h" RTC_DS1307 RTC; #define ONE_WIRE_BUS 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress Thermometer1 = {0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD }; // адрес датчика DS18B20 28FFAADBA21604CD DeviceAddress Thermometer2 = {0x28, 0xFF, 0xF3, 0x4A, 0xA3, 0x16, 0x05, 0x30 }; // 28FFF34AA3160530 DeviceAddress Thermometer3 = {0x28, 0xFF, 0x69, 0xCF, 0xA2, 0x16, 0x04, 0x97 }; // 28FFF34AA3160530 #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif int analog=A0; //пульт руль int inPin = 3; //газ int analogInput = A6; //вход для вольтметра float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ //Символ градуса byte grad[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; void setup() { pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку pinMode(analogInput, INPUT); lcd.createChar(0, grad); //Символ градуса lcd.setCursor(0, 0); //курсор lcd.print("Hello rascals!:)"); //надпись при включении delay(3000); //задержка lcd.clear(); //очистить екран if (! RTC.isrunning()) { // строка ниже используется для настройки даты и времени часов // RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { analog=analogRead(14); //считываем сигнал с пина АЦП if(analog>750&&analog<820) // k1 - up { pinMode(8, OUTPUT); digitalWrite(8,LOW); delay(50); pinMode(8, INPUT); delay(100); } if(analog>300&&analog<400) //k2 - right { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(50); pinMode(9, INPUT); delay(100); } if(analog>200&&analog<290) //k3 down { pinMode(10, OUTPUT); digitalWrite(10,LOW); delay(50); pinMode(10, INPUT); delay(100); } if(analog>100&&analog<190) //k4 vol+ { // для енкодера pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(11, HIGH); delay(4); digitalWrite(12, HIGH); delay(4); digitalWrite(11,LOW); delay(4); digitalWrite(12,LOW); delay(4); pinMode(11, INPUT); pinMode(12, INPUT); } if(analog>=0&&analog<80) //k5 vol- { // для енкодера pinMode(12, OUTPUT); pinMode(11, OUTPUT); digitalWrite(12, HIGH); delay(4); digitalWrite(11, HIGH); delay(4); digitalWrite(12,LOW); delay(4); digitalWrite(11,LOW); delay(4); pinMode(12, INPUT); pinMode(11, INPUT); } //вольтметр vin = float(analogRead(analogInput))/18.3; //подстроичное число для показа вольтметра lcd.setCursor(11, 1); lcd.print(""); lcd.print(vin, 1); lcd.print("V"); //температура 1 sensors.requestTemperatures(); lcd.setCursor(0, 0); lcd.print(""); lcd.print(round(sensors.getTempCByIndex(0))); lcd.printByte(0); lcd.print("C"); //температура 3 lcd.setCursor(0, 1); lcd.print(""); lcd.print(round(sensors.getTempCByIndex(2))); lcd.printByte(0); lcd.print("C"); //часы DateTime now = RTC.now(); DateTime future (now.unixtime() + 7 * 86400L + 30); lcd.setCursor(11, 0); lcd.print(future.hour(), DEC); lcd.print(':'); lcd.print(future.minute(), DEC); //газ if (digitalRead(inPin)) { lcd.setCursor(6, 0); lcd.print("GAZ"); lcd.setCursor(5, 1); lcd.print(""); lcd.print(round(sensors.getTempCByIndex(1))); //температура 2 lcd.printByte(0); lcd.print("C"); } else { lcd.setCursor(6, 0); lcd.print(" - "); } }Подскажите как можно избавиться от этих косяков или как упростить скетч чтоб уменьшить цикл.
совершенно верно говорите и сам думаю о развитии но ездить то не удобно...))
/*Class_Lcd_Keys.ino */ class Cl_Sys;// предварительно объявить о создании класса Sys для послед подключения к нему //-----Cl_an_btn5----------------- class Cl_an_btn5 { byte pin ; // нога аналог клавиатуры void (*Do_right)(), (*Do_up)(), (*Do_down)(), (*Do_left)(), (*Do_select)(); byte read() { const int Right = 60; // ниже = нажата кнопка Right const int Up = 200; // ниже = нажата кнопка Up const int Down = 400; // ниже = нажата кнопка Down const int Left = 600; // ниже = нажата кнопка Left const int Select = 800; // ниже = нажата кнопка Select static int a ; a = analogRead(pin); if (a < Right) return 1; else if (a < Up) return 2; else if (a < Down) return 3; else if (a < Left) return 4; else if (a < Select) return 5; else return 0; } byte abtn, abtn_old; // старый и новый номер нажатой клавиши bool bounce_abtn = 0; // антидребезговый флаг uint32_t past = 0 ; // временной отчет public: // указатель на следующий элемент Cl_an_btn5 *pnt; // конструктора Cl_an_btn5(Cl_Sys *Sys, byte _pin, void (* _Do_right)(), void (* _Do_up)(), void (* _Do_down)(), void (* _Do_left)(), void (* _Do_select)()); // setup() void setup() { if (this->pnt != NULL) this->pnt->setup(); abtn = read() ; // прочитать реальное значение на выводе } // loop() void loop() { if (this->pnt != NULL) this->pnt->loop(); if (! bounce_abtn && abtn != read()) { // если прошел фронт изм на выводн bounce_abtn = 1; // выставить флаг past = millis(); // сделать временую засветку } else if ( bounce_abtn && millis() - past >= 5 ) { // если прошло антидребезговое время bounce_abtn = 0; // то снять флаг abtn_old = abtn ; abtn = read() ; // прочитать реальное значение на выводе if (abtn_old == 0) { if (abtn == 1) Do_right() ; if (abtn == 2) Do_up() ; if (abtn == 3) Do_down() ; if (abtn == 4) Do_left() ; if (abtn == 5) Do_select() ; } } } }; //-----Cl_Sys----------------- class Cl_Sys { public: Cl_an_btn5 *Start_btn5 = NULL; Cl_Sys() {} // setup() void setup() { for (Cl_an_btn5 *i = Start_btn5; i != NULL; i = i->pnt) i->setup(); } void loop() { for (Cl_an_btn5 *i = Start_btn5; i != NULL; i = i->pnt) i->loop(); } } Sys; //---------описание классов------------ Cl_an_btn5::Cl_an_btn5(Cl_Sys *Sys, byte _pin, void (* _Do_right)(), void (* _Do_up)(), void (* _Do_down)(), void (* _Do_left)(), void (* _Do_select)()) : pin(_pin), Do_right(_Do_right), Do_up( _Do_up), Do_down(_Do_down), Do_left(_Do_left), Do_select(_Do_select) { pnt = Sys->Start_btn5; Sys->Start_btn5 = this; } //----------Компоновка--------------------- #include <LiquidCrystal.h> LiquidCrystal lcd(/*RS*/8,/*Enable*/9,/*D4*/ 4,/*D5*/5,/*D6*/6,/*D7*/7); void Do_right () { lcd.setCursor(10, 1); lcd.print ("Right "); } void Do_up () { lcd.setCursor(10, 1); lcd.print ("Up "); } void Do_down () { lcd.setCursor(10, 1); lcd.print ("Down "); } void Do_left () { lcd.setCursor(10, 1); lcd.print ("Left "); } void Do_select() { lcd.setCursor(10, 1); lcd.print ("Select"); } Cl_an_btn5 *A_Btn = new Cl_an_btn5(&Sys , /*пин*/A0, /*обработчик Right*/ Do_right ,/*обработчик Right*/Do_up, /*обработчик Down*/ Do_down ,/*обработчик Left*/ Do_left, /*обработчик Select*/Do_select); //-----------Main()----------------------- void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("LCD Key Shield"); lcd.setCursor(0, 1); lcd.print("Press Key:"); Sys.setup(); } void loop() { Sys.loop(); }Вот присмотритесь к этому.
qwone, эдак Вы всех неофитов в кардиологию отправите.)))
Katroha, вы пример, вышепредставленный, изучите и постарайтесь понять.
А основной ваш косяк в том, что все запихали в loop и долбитесь в разные функции на каждом проходе. И все бы опять ничего, если бы не поганая библиотека Dallas Temperature, в которой прямо прописан delay(750), вот во время этого факенделая ничего и не считывается, а МК занимается работой сотрудников думы, сидит и нихрена не делает.(((
Для разделения дел во времени почитайте блог одного уважаемого члена сообщества. Для ликвидации DT библиотеки и экономии 2К памяти, топик не менее уважаемого.
qwone, эдак Вы всех неофитов в кардиологию отправите.)))
Я вообще удивляюсь как они на таких этажерках летают.
qwone, эдак Вы всех неофитов в кардиологию отправите.)))
Я вообще удивляюсь как они на таких этажерках летают.
Не может, но летает. А самое смешное, что с того момента принципиально ничего не изменилось.)))
Летает. @_@. Да оно больше падает, ломается и чинится,чем делает вид, что летает. Все поменялось принципиально. Вот только слепые, глухие и тупые этого не видят. Или же им мозг полностью засрали.
Принципиально, это когда убрали крылья, поставили винт сверху и получили вертолет, или набили трубу топливом и получили ракету. Это принципиально. Для самолетов, появились новые конструкционные материалы (которых на тот момент просто не существовало), набрали статистику, подвели математическую базу, но вертолетом он от этого не стал (корпус, крылья, двигатель в продольной плоскости и все сопутствующие данной конструкции ограничения).
Принципиально это когда не убрали крылья, а когда безопасность полетов возросла. Причем подымали эту безопасность на каждом этапе, от идеи, преектирования, до эксплуатации. Вот так и с проектированием программ. Ведь почему появились языки высокого уровня, а потом и они усложнились. Это ведь не потому ,что программисты сектанты какие-то, а потому что так лучше проще и надежнее создавать программы. А тут на Ардуине дали кусок ткани, рейки и моток веревки и лети наш дорогой Икар и не падай возле наших глаз.
А тут на Ардуине дали кусок ткани, рейки и моток веревки и лети наш дорогой Икар и не падай возле наших глаз.
Так ведь никто и никогда не пытался позиционировать Ардуино как профессиональное средство разработки. Конструктор для домашних поделок и ничего более, ошибка в программе или схемотехнике кроме разочарования ничего за собой не влечет.
Летает. @_@. Да оно больше падает, ломается и чинится,чем делает вид, что летает. Все поменялось принципиально. Вот только слепые, глухие и тупые этого не видят. Или же им мозг полностью засрали.
просто как в церкви каких то новых проповедников послушал))))
Так ведь никто и никогда не пытался позиционировать Ардуино как профессиональное средство разработки. Конструктор для домашних поделок и ничего более, ошибка в программе или схемотехнике кроме разочарования ничего за собой не влечет.
на 100% поддержал)))
Ведь для чего народ парится на Ардуине. Ради разочарования.
А основной ваш косяк в том, что все запихали в loop и долбитесь в разные функции на каждом проходе.
Вот про это и думал. Просто с разных скетчей делал один, вот такое и получилось, а как по другому хз.
Спасибо за ссылки, буду изучать. Думаю все что связано с lcd отправить как-бы в один loop, а кнопки от магнитолы у второй? Ну и избавиться от библиотеки ДалласТемп.
вот так и думал, походу идет какоето постоянное обновление, спс работает)))
еще будет моргать если в коде loop есть
http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty-s-ds18b20-iz-bibly-oneware?page=3#comment-280218
*в 19 строке кода вместо 100 нужно поставить 1000
От библиотеки не избавлялся, а вот из цикла вынес датчики температуры и вольтметр. Теперь пульт к магнетоле работает отлично и остальное без замечаний. Спасибо!!!))
Появился новый вопрос))
Хотел сделать програмную регулировку яркости подсвети LCD1602? скетч написал, тестером проверил с пина выходит 5в. , а при подключении к экрану подсветка светит только в половину яркости, тестер показывает 2.5в., резик в экрани стоит всего на 100Ом.
Вчем прикол? ардуина про мини 5в. не вытягивает светик или еще может быть что-то???
Спасибо.
Я надеюсь, транзистор не забыли поставить?
Вчем прикол?
Пин не может отдавать ток более 40 мА.
Как раз без него и делал. В уроках про светодиод подключались напрямую.
Буду искать, учить. Спасибо.