[QUESTION] i2c LCD 1602, рандомно "умирает", лезут крякозябры.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

sadman41 пишет:

Конечно я не знаю, откуда вы библиотеки брали, у меня таких нет и я накачал с гугола. Подключил только один дисплей без RTC и DHT.

Пардон, совсем запамятовал про библиотеки. Вот:
1) https://github.com/marcoschwartz/LiquidCrystal_I2C
2) https://github.com/adafruit/DHT-sensor-library
3) https://github.com/NeiroNx/RTCLib

 

sadman41 пишет:

Затыков на старте я не вижу (несколько раз ребутил по разному) и с двумя строчами и с одной. А вот непонятная ерунда один раз проскочила. Но она быстро была запечатана цифрами. Однако, судя по коду, это случилось в районе:

    lcd.setCursor(0, 0); lcd.print("                ");
    lcd.setCursor(0, 0); lcd.print(RTC_TIME + " " + RTC_VOLTAGE + " V");

Это была пустая строка, оканчивающаяся неизвестным мне знаком (но я видел его менее долей секунды), потом 'V'. Т.е. можно предположить, что проблема в RTC_TIME & RTC_VOLTAGE (часы у меня не подключены, а у вас, может и отваливаются вовсе).

Кхм... обращу на это внимание. Но, у меня если и лезли крякозябры, то лезли сразу на весь экран, а не только на одну строку.

 

sadman41 пишет:

Вообще мне фрагмент предваряющего кода кажется весьма странным (хотя я в стрингах не особо разбираюсь): 

    String RTC_VOLTAGE = String ( RTC_BATTERY_VOLTAGE, 2 );
    if ( DEBUG == true && RTC_VOLTAGE == false ) {
      Serial.println("PROBLEM WITH RTC_VOLTAGE STRING!");
    }

Насколько я понял, String() возвращает адрес в памяти. В этом случае непонятно, когда вы предполагаете увидеть "PROBLEM WITH RTC_VOLTAGE STRING!" - когда адрес будет равен 0x00? Но если так, то зачем вы засылаете на LCD область памяти в любом случае - и когда есть проблема и когда нет.

Этот "иф" я дописал уже позже кода как временную проверку на переполнение памяти помимо той, где немного редактируем либу. Собственно, выше мне посоветовали сделать проверку эту. Вот линк на тему: http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-kontrol-pamyati-pri-ispolzovanii-string

Я особо в подробности Стрингов не вдавался, просто прислушался к этому: 

ЕвгенийП пишет:

Если же Вы по каким-то причинам не можете или не хотите отказываться от использования String, то, блин, ну хотя бы проверяйте выделилась ли объекту память! Ну что сложного написать

1 if (myString) …

Если с памятью всё нормально – будет ИСТИНА, а если получается false, то приплыли! Вы же никогда этого не делаете!

 

sadman41 пишет:

Будь я на вашем месте - я бы начал с простого: повыкидывал к чертям из кода всю остальную перефирию и куски, не относящийся к LCD. Пусть прямо в сетапе одну строку печатает, а в лупе ничего не делает. После этого бы решал - проблема в дисплее или, к примеру, в часах которые тупят.

Уже делал так. Но перетыкать питание надоело. Крякозябры чаще лезли именно в процессе работы, а не при первой отрисовке. Причем, в совершенно рандомное время.

К слову, уже 20 часов аптайм, крякозябр нет. Время, вольтаж выводятся корректно. Стоит оговориться, выводит-то корректно, только время "убегает" вперед. Но это было с модулем часов и до всего этого. Главное - данные корректные приходят. Данные с DHT22 тоже в норме. Относительную влажность не с чем сравнить, а вот температура вполне адекватная считывается. На термометре ~25.5 градусов, на датчике 25.0, а инфракрасный термометр показывает 24.9. Как видим, данные выводятся вполне корректно. Если бы был косяк со Стрингами, то должен был загореться светодиод и не выключаться, но ничего не загорелось. Значит все хорошо с ними.

Может и рано судить, но, кажется, пайка помогла избавиться от крякозябр. Только вот привнесла "затупы" при старте. Пока все было на макетке - экран стартовал сразу же. Странно как-то. А затупы, в свою очередь, в значительной мере помогли исправить те 2 строчки после инициализации дисплея. Без них он зависал при подаче питания заметно чаще и дольше "приходил в себя". Однако, я пока оставлю все работать как есть еще на какое-то время, вдруг крякозябры всплывут, али светодиод загорится. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Тэкс... Давайте поступим проще. Вот этот скетч залейте (без добавлений всяких строчек дополнительных):

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x26,16,2);

void setup()
{
  lcd.init();
  lcd.clear();
  lcd.print("Hello, world!");
}


void loop()
{
   static char c;
   if (0x00 == c) {c = 0x21;}
   lcd.setCursor(0, 1); lcd.print(c); lcd.print(" "); lcd.print((byte) c, HEX);
   delay(250);
   c++; 
}

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

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

sadman41 пишет:

Тэкс... Давайте поступим проще. Вот этот скетч залейте (без добавлений всяких строчек дополнительных):

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x26,16,2);

void setup()
{
  lcd.init();
  lcd.clear();
  lcd.print("Hello, world!");
}


void loop()
{
   static char c;
   if (0x00 == c) {c = 0x21;}
   lcd.setCursor(0, 1); lcd.print(c); lcd.print(" "); lcd.print((byte) c, HEX);
   delay(250);
   c++; 
}

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

Сейчас сделаю. К слову, на данный момент аптайм 1 день, 15 часов, 38 минут. Да и экранчик еще один будет сегодня вечером. Так что, пока тестировать буду на текущем экранчике.

Итак, залил. Что теперь именно интересует? Опишу что наблюдаю:

1) "Подергал" питание. Время от подачи питания, до начала вывода экранчиком информации находится в пределах 2.1-3.6 сек (0.1 сек можно отнести к задержке тыкания пальцем по секундомеру). Не важно, сколько время пройдет между отключением питания и подачей вновь - время это не одинаково. Однако, чаще 2.5-2.6 сек.
2) Т.к. было трудно разглядеть без подсветки выводимую инфу, я позволил себе дописать lcd.backlight() после инициализации. По времени вывода инфы на экран без включения подсветки разницы не заметил. Во всяком случае на секундомере ее не смог отследить.
3) В первой строке выводится "Ало, салют!", во второй символ и через пробел его адрес. Сначала идут символы типа !"№;%, потом цифры, потом буквы английского алфавита в верхнем регистре, еще пару символов, потом буквы в нижнем регистре, еще пару символов, потом несколько пустых символов, потом иероглифы и прочие нестандартные символы, и, в конце концов, все начинается по кругу. Короче, символы соответствуют тем, что указаны в таблице символов. Пока оставил работать так.

*апдейт* поправил грамматику и недопечатки, пальцы еще не отогрелись %)

sadman41
Offline
Зарегистрирован: 19.10.2016

adrift_into_infinity пишет:
1) "Подергал" питание. Время от подачи питания, до начала вывода экранчиком информации находится в пределах 2.1-3.6 сек (0.1 сек можно отнести к задержке тыкания пальцем по секундомеру). Не важно, сколько время пройдет между отключением питания и подачей вновь - время это не одинаково. Однако, чаще 2.5-2.6 сек.

Т.е. экран стартует стабильно, и можно отнести все описанные ранее тормоза на счет остальных компонентов или кода с ним работающего.

adrift_into_infinity пишет:
2) Т.к. было трудно разглядеть без подсветки выводимую инфу, я позволил себе дописать lcd.backlight() после инициализации. По времени вывода инфы на экран без включения подсветки разницы не заметил. Во всяком случае на секундомере ее не смог отследить.

Странно. На модуле I2C cиний резистор регулировки контрастности-то крутили? У меня без подсветки всё видно в дневном свете. Подсветку я деактивировал чтобы снизить энергопотребление (чисто для проверки).

adrift_into_infinity пишет:
3) В первой строке выводится "Ало, салют!", во второй символ и через пробел его адрес. Сначала идут символы типа !"№;%, потом цифры, потом буквы английского алфавита в верхнем регистре, еще пару символов, потомбуквы в нижнем регистре, еще пару символов, потом несколько пустых символов, потом иероглифы и прочие нестандартные символы, и, в конце концов, все начинается по кругу. Короче, символы соответствуют тем, что указаны в таблице символов. Пока оставил работать так.

В том случае, если у вас вместо "Hello, world!" выводится "Ало, салют!" - то экран нужно нести к экзорцисту. В противном - скорее всего экран непричем и работает он так же, как мой. Только вот с подсветкой/яркостью вопрос. Потрясите его, пожамкайте, пластиковой палочкой легонько постукайте по плате. Может где-то непропай или трещина. В том случае, если все ок, то стоит начать искать проблему в других компонентах и коде. Последовательно подключайте их к системе и последовательно добавляйте в уже стабильно работающий код фрагменты того, который работает с добавляемой железкой. Другого пути нет.

 

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

sadman41 пишет:

В том случае, если у вас вместо "Hello, world!" выводится "Ало, салют!" - то экран нужно нести к экзорцисту. В противном - скорее всего экран непричем и работает он так же, как мой. 

=)

sadman41 пишет:

Только вот с подсветкой/яркостью вопрос. Потрясите его, пожамкайте, пластиковой палочкой легонько постукайте по плате. Может где-то непропай или трещина. В том случае, если все ок, то стоит начать искать проблему в других компонентах и коде. Последовательно подключайте их к системе и последовательно добавляйте в уже стабильно работающий код фрагменты того, который работает с добавляемой железкой. Другого пути нет.

Уже и тряс его, и i2c адаптер пальцами немного "прогибал" - все окей. Это, скорее всего, уже мое зрение подводит.

В общем, примусь искать косяк в коде. Спасибо за помощь.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Товарищ Гамлет, не надо какать таким образом в темы. Это, как минимум, некрасиво и неуместно.

В общем, по сей день отработали нормально оба экрана (старый и новый). Причем, старый отработал на старом же коде, а новый гонялся на коде, который в оной теме давали для вывода таблицы символов. А это уже почти 12 дней аптайтма для "старого", и дней 10 для нового (пару дней тестировал разные варианты старого кода). Видимо, со Стрингами проблемы нет... Впрочем, он до сих пор пашет на балконе, и пока все нормально работает. 

Но вот недавно случился облом. Новый экран выдал крякозябры! *паника* Что изменилось? Ну, я всего лишь сегодня залез на балкон ради сверки показаний DHT22 с градусником (я там оставил работать оба экрана изначально). После чего перетащил новый экранчик в комнату и оставил там отогреваться (он все еще был включен). Вернувшись через пару-тройку часов, уселся за комп. Минут через 15-20 экран показал крякозябры... Т.е. после того, как я перетащил экранчик с балкона, как минимум пару-тройку часов он работал без проблем. Что же тогда выходит? Помехи?

Я еще решил для верности посмотреть на... кхм, как там правильно говорится... "зашумленность" эфира? Для этого скачал на мобильный Wi-Fi Analyzer и сравнил показания на балконе и в комнате. В общем, на балконе хотя и есть пара сетей (помимо моей), но сигнал весьма слабый. А вот уже в комнате видно около 8 сетей (помимо моей) с довольно сильным уровнем сигнала. Так вот, может все дело было изначально в том, что в этой комнате так сильно "загажен" радиоэфир? Тогда что делать? Экран из фольги и шапочку в довесок? =) 

P.S. Я, в принципе, могу вытащить с балкона и "старый" вариант, если надобно.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

adrift_into_infinity пишет:
Минут через 15-20 экран показал крякозябры... Т.е. после того, как я перетащил экранчик с балкона, как минимум пару-тройку часов он работал без проблем. Что же тогда выходит? Помехи?

Трещины в пайке или излишняя проводимость там, где ее не должно быть.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Andrey_Y_Ostanovsky пишет:

adrift_into_infinity пишет:
Минут через 15-20 экран показал крякозябры... Т.е. после того, как я перетащил экранчик с балкона, как минимум пару-тройку часов он работал без проблем. Что же тогда выходит? Помехи?

Трещины в пайке или излишняя проводимость там, где ее не должно быть.

Эээм... а можно поподробнее про "излишнюю проводимость"? А то я с электроникой не дружу... Да и впервые слышу о таком.

На счет пайки. Я лично оба экранчика  перепаял. Ну, точнее говоря крепление на штырях i2c адаптера к экрану. Тот еще геморрой словил с удалением припоя... Да и пропаял я тогда добротно. Все отлично держится. Да и откуда трещинам в пайке взяться? Я его ни разу не ронял, да и сильным вибрациям не подвергал... отчего же тогда должны появиться трещины? Или раз уж они пошли, то как тогда понять где же трещины?

Я пробовал "прозванивать" мультиметром. Если где-то плохой контакт, то при "шевелении" писк мультиметра прерывался, пусть и чуточку. Ну... во всяком случае я так проверяю сомнительные места =) Пока ни разу не подводило.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

adrift_into_infinity пишет:
как тогда понять где же трещины?

Увы, по причине трещин - материнские платы бывает дешевле выбросить, чем их искать, что уж говорить о копеечном индикаторе.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017
Andrey_Y_Ostanovsky
, т.е. этот новый экранчик "тоже бракованный"? Не уж то мне так повезло 2 брака подряд купить?
 
Я как раз только что вышел на балкон и глянул на старый экранчик. Все отлично, работает. И это на нем я впервые словил крякозябры в той же комнате, где "крякнул" новый экранчик... Может, все же помехи? Или еще что? Кажется логичными то, что если бы эти оба экрана были с каким-то косяком, то им было бы все равно где "крякнуть". Но вот старый экранчик уже почти 2 недели аптайма выдал на том же балконе.
 
Пойти и перетащить в комнату что ли... да, пожалуй, так и сделаю. Если и он выдаст крякозябры, значит дело в чем-то еще. Других идей у меня нет, к сожалению =(
bwn
Offline
Зарегистрирован: 25.08.2014

adrift_into_infinity пишет:

Пойти и перетащить в комнату что ли... да, пожалуй, так и сделаю. Если и он выдаст крякозябры, значит дело в чем-то еще. Других идей у меня нет, к сожалению =(

Фотки забросьте, как все смонтированно.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Извиняйте за поздний ответ. Только вернулся. Там где я сейчас обитаю с интернетом туго. Постараюсь отвечать по мере возможности. 

А экранчик (старый) тоже показал крякозябры вчера =( Не знаю точно когда, правда. 

bwn пишет:

adrift_into_infinity пишет:

Пойти и перетащить в комнату что ли... да, пожалуй, так и сделаю. Если и он выдаст крякозябры, значит дело в чем-то еще. Других идей у меня нет, к сожалению =(

Фотки забросьте, как все смонтированно.

Так-с, по вопросу. Вариант с новым экранчиком уже был распаян обратно и отдан знакомому "на растерзание", посему уже не обрадую фотографией.

А что именно мне надо было показать на фото, кстати? А то я о чем-то кроме 4 коротких проводов (~5 см) соединяющих ардуину нано с экранчиком (SDA, SCL, +5V, GND) и не догадываюсь... Не фото же понижающего модуля? Или это вопрос о том как именно я соединил ардуину и экранчик? Если так, то, как я уже должен был писать ранее, я все посадил на пайку. Т.е. провода припаял к пинам ардуины и экранчика. Никаких BMS разъемов. Это я уже уяснил. Только "напрямую" паял. 

bwn
Offline
Зарегистрирован: 25.08.2014

Вопрос больше про Ваше умение пайки. Обычно симптомы, "потрогал и сломалось", это 99% - плохой контакт или наоборот сопля. Какие то наводки? Если только дом прямо под ЛЭП стоит. 
Соответственно и вопросы: каким флюсом пользовались, как отмывали, как зачищали, к чему припаивались (обычные гребенки очень плохо паяются без подготовки). 
Здесь не в обиду, сам налетел на ядерный флюс: паяется великолепно, любой окисел убирает на ура, вот только эта падла спиритом до конца не снимается, исключительно горячей водой. В итоге: пока на улице прохладно, все работает, потеплело, I2C кракозябры высветило и повисло все. Снимаю, домой приношу, все уже работает. У него еще и электропроводность проявлялась только выше какого то температурного порога. Недели две долбался, пока дотумкал.

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

bwn пишет:

Вопрос больше про Ваше умение пайки. Обычно симптомы, "потрогал и сломалось", это 99% - плохой контакт или наоборот сопля. Какие то наводки? Если только дом прямо под ЛЭП стоит. 
Соответственно и вопросы: каким флюсом пользовались, как отмывали, как зачищали, к чему припаивались (обычные гребенки очень плохо паяются без подготовки). 
Здесь не в обиду, сам налетел на ядерный флюс: паяется великолепно, любой окисел убирает на ура, вот только эта падла спиритом до конца не снимается, исключительно горячей водой. В итоге: пока на улице прохладно, все работает, потеплело, I2C кракозябры высветило и повисло все. Снимаю, домой приношу, все уже работает. У него еще и электропроводность проявлялась только выше какого то температурного порога. Недели две долбался, пока дотумкал.

Ну, я далеко не спец в пайке, и каким-то особым видам шаманств не прибегаю во время пайки... Так что никаких обид!

Дом не прямо под ЛЭП, но есть пара опор неподалеку. До ближайшей опоры ЛЭП примерно метров 15... точно не могу сказать, деревья мешают точному замеру. А вот провода между опор висящие в ~5.5 метрах от окон комнаты, если верить лазерному дальномеру. Вообще сложновато "прицелиться" было в висящие провода, но лазерное наведение помогло.
 
Флюс "ЛТИ-120", припой ПОС 61 (ГОСТ21931-76).
Сначала брал "ватные диски" ("без ворсинок") для снятия штукатурки с дамских лиц. Далее смачивал диски эти Уайт-спиритом и тщательно протирал пины. После этого брал среднюю шкурку и зачищал поверхность спаиваемых деталей. После этого брал мелкую шкурку и так же зачищал. После этого вновь брал Уайт-спирит и новым смоченным диском зачищал поверхности. После этого с с помощью шприца наносил флюс (ЛТИ-120) на нужные места. После этого с помощью припоя (ПОС 61) лудил и припаивал провода. Ну, провода, само собой, были зачищены и залужены заранее. Остатки флюса убирал с помощью того же Уайт-спирита. Убирается он довольно легко. Вот и все, ничего такого особого вроде не сделал. Припоя не жалею, но и не перебарщиваю.
 
Вообще никогда ранее не сталкивался с проблемой своей пайки. Все что ранее паял отлично работает и по сей день... Меня все же очень напрягает тот факт, кто крякозябры вылезают исключительно в комнате. Да и сетовать на плохой пропай думаю не стоит, ибо не один раз перемещал это добро на балконе, и все работало и дальше отлично. Да и вот я сейчас хорошо так сделал "труба-шатал" всего того, что "шатается". Никаких крякозябр не вылезло. Отсюда делаю вывод - с пайкой все нормально.
 
А случайно "вафля" не может "шуметь" настолько сильно, что создадутся помехи для экранчика? Я не раз читал о забавном случае, да еще и лично на работе однажды столкнулся, когда микроволновка стояла через стенку (гипсокартон) от вай-фай роутера. И в моем случае когда ее включали именно на максимальную мощность, старенькое оборудование с вафлей начинало терять соединение. Особенно телефоны и планшеты. Решилось перемещением микроволновки в другой конец помещения. Не может ли тут быть похожее что-то? Проверить что за стеной не предоставляется возможным, к сожалению.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

adrift_into_infinity пишет:
и каким-то особым видам шаманств не прибегаю во время пайки...
Как?!? Вы паяете не в ночь полнолуиня и не используете слюни девствениц в качестве флюса? А как же у Вас вообще что-то работает?

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

ЕвгенийП пишет:

adrift_into_infinity пишет:
и каким-то особым видам шаманств не прибегаю во время пайки...
Как?!? Вы паяете не в ночь полнолуиня и не используете слюни девствениц в качестве флюса? А как же у Вас вообще что-то работает?

Так весь секрет в слюнях? =D

bwn
Offline
Зарегистрирован: 25.08.2014

Ну тады не знаю. Я сваркой в пяти метрах от него орудую, ничего не кракозябрится. Загадка природы.))))

XManiac
Offline
Зарегистрирован: 21.04.2015

Здрав будьте! Смотрю причин не обнаружено... А пациентов прибавляется.

Почитал, поржал, поплакал) кодю на досуге, Мега, I2C LCD, RTC, все работает! Прочитавши заменил дисплей на "такой же", заказывал два. Так вот второй LCD сначала бред со сдвигом выдает. а потом и кракозябли вылезают(, правда известно когда, тест из #52 проходит, переподключаю только шину I2C, как быть не ясно(... Кракозябли ползут после вызова функции ShowTime()



//Часы реал времени + дисплей  все по I2C
// две кнопы pin 3 pin 4 на минус

#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dow,           // 1-7
                   byte dom,           // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dow));
   Wire.write(decToBcd(dom));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dow,
          byte *dom,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dow        = bcdToDec(Wire.read());
  *dom        = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

char* days[]={"xz","Monday", "Thusday",
                    "Wednesday", "Thursday",
                    "Friday", "Saterday",
                    "Sunday"};
bool blinking = true;
bool reset = true;
 
byte second=50, minute, hour, dow=1, dom, month, year, minuteold;
bool setminute=0, sethour=1, setdow=0, setdom=0, setmonth=0, setyear=0; 
bool stm=0; // Показывать день недели или Set time
static unsigned long prevMillis = 0;  bool crash=1; // ничего не нажали при установке времени после ресета - был сбой питания( 
static unsigned long previousMillis = 0; // обновлять. запрашивать часы раз в секунду не засираем канал
void setup()
{
pinMode (4, INPUT);   // mode
pinMode (3, INPUT);  // set
pinMode (13, OUTPUT);  // Control
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
  lcd.begin();
  lcd.clear();

  Wire.begin();
 getDateDs1307(&second, &minute, &hour, &dow, &dom, &month, &year);
}

void loop()
{
  
  if (!reset) {   //основная программа 
  if ((digitalRead(4)==LOW)&(digitalRead(3)== LOW)) {reset=true;} blinking = false;  lcd.noBlink();lcd.noCursor();
  if(millis() - previousMillis > 1000) {previousMillis = millis(); ShowTime();  }

 // Do something here...
 
  }
  else // в начале установка времени и даты , для изменения в проге reset=1
  {
  lcd.blink();
  lcd.setCursor(0,0);    
  if (hour <10)   { lcd.print(' ');} lcd.print(hour,   DEC); lcd.print(":");
  if (minute <10) { lcd.print('0');} lcd.print(minute, DEC); lcd.print("   ");
  if (dom <10)    { lcd.print('0');} lcd.print(dom,    DEC); lcd.print("/");
  if (month <10)  { lcd.print('0');} lcd.print(month,  DEC); lcd.print("/");
  if (year <10)   { lcd.print('0');} lcd.print(year,   DEC);
  if (setdow){lcd.setCursor(0,1); lcd.print(days[dow]);lcd.print("   ");lcd.setCursor(0,1); delay(100);} 
     else {if (!stm){lcd.setCursor(0,3); lcd.print("Set time!    " );}}
 
if ((digitalRead(3)== LOW) || (digitalRead(4)== LOW)) {digitalWrite(13, HIGH);crash=0;prevMillis = millis();}else digitalWrite(13, LOW);
  
  if (sethour)     {lcd.setCursor(1,0);if (digitalRead(3)== LOW)  {hour=hour+1;delay(70);     if (hour>23)hour=0;}     else delay(50);
      if (digitalRead(4)==LOW) {sethour=0; setminute=1;delay(200);}}
  if (setminute)   {lcd.setCursor(4,0);if (digitalRead(3)== LOW)  {minute=minute+1;delay(50); if (minute>59)minute=0;} else delay(50);
      if (digitalRead(4)==LOW) {setminute=0; setdom=1;delay(200);}}
  if (setdom)      {lcd.setCursor(9,0);if (digitalRead(3)== LOW)  {dom=dom+1;delay(100);       if (dom>31)dom=0;}   else delay(50);
      if (digitalRead(4)==LOW) {setdom=0; setmonth=1;delay(200);}}
  if (setmonth)    {lcd.setCursor(12,0);if (digitalRead(3)== LOW) {month=month+1;delay(150);   if (month>12)month=0;}   else delay(50);
      if (digitalRead(4)==LOW) {setmonth=0; setyear=1;delay(200);}}
  if (setyear)     {lcd.setCursor(15,0);if (digitalRead(3)== LOW) {year=year+1;delay(50);     if (year>99)year=0;}     else delay(50);
      if (digitalRead(4)==LOW) {setyear=0; setdow=1;delay(200);}}
  if (setdow)      {lcd.setCursor(0,1);if (digitalRead(3)== LOW)  {dow=dow+1;delay(100);       if (dow>7)dow=1;}        else delay(50);
      if (digitalRead(4)==LOW) {setdow=0; stm=1;delay(200);}}
  if (stm)         {lcd.setCursor(0,1); lcd.print("WRITE???  Y/N" ); if (digitalRead(4)== LOW) { stm=0;sethour=1;}          
      if ((digitalRead(3)==LOW)& (stm)) {setDateDs1307(second, minute, hour, dow, dom, month, year); reset=0; stm=0;sethour=1;lcd.clear();lcd.noBlink();}}
 
 // ничего не делаем Х минут дефолт нужны установки по дефолту, время сохраняется 
 if(millis() - prevMillis > 6000) {
 prevMillis = millis();getDateDs1307(&second, &minute, &hour, &dow, &dom, &month, &year);setDateDs1307(second, minute, hour, dow, dom, month, year); reset=0; stm=0;sethour=1;lcd.clear();lcd.noBlink(); 
 if (crash) {lcd.setCursor(11,1);lcd.print("CRASH");}}
}
 }

void ShowTime(){
 byte static prevSec=0;
 getDateDs1307(&second, &minute, &hour, &dow, &dom, &month, &year);
 if (second != prevSec){
  //lcd.clear();
  lcd.setCursor(0,0);lcd.print('               ');lcd.setCursor(0,1);lcd.print('               ');lcd.setCursor(0,0);
  if (hour <10) { lcd.print(' ');lcd.print(hour, DEC);} else lcd.print(hour, DEC);
  lcd.print( (second %2 )?" ":":");
  if (minute <10) { lcd.print('0');lcd.print(minute, DEC);} else lcd.print(minute, DEC);
  lcd.print("   ");
  if (month <10) { lcd.print('0');lcd.print(month, DEC);} else lcd.print(month, DEC);
  lcd.print("/");
  if (dom <10) { lcd.print('0');lcd.print(dom, DEC);} else lcd.print(dom, DEC);
  lcd.print("/");
   if (year <10) { lcd.print('0');lcd.print(year, DEC);} else lcd.print(year, DEC);
  lcd.setCursor(0,1);
  lcd.print(days[dow]);  
 }  
}

 

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

Доброго времени суток!

Касательно моей проблемы с крякозябрами. Провел пару тестов:
1) Подключил оба 16х2 дисплея одновременно (на втором припаял перемычку для смены адреса), и выводил на них одну и ту же информацию. 

На балконе ни 1 крякозябра не вылезло за 4 с лишним дня. 
Для проверки тряс все что можно периодически. Крякозябры не вылезли. 
Позже вытащил все это дело с балкона и занес в комнату. Часов 5 все работало нормально, после чего один экран показал крязкоябры, а второй продолжал работать... Но было решено оставить как есть. Еще примерно сутки второй экран проработал нормально, и только потом показал крязкозябры. Крякозябры были разные на экранчиках. 

2) Потом я купил 20х4 экранчик... Его на балкон не выносил для теста, сразу в комнате оставил. Отсоединил оба мелких экранчика и подцепил большой. Малюсенькая правка в коде и тест вновь начался. Уже почти 2 суток работает, крякозябр пока не вылезло. Надо бы, конечно, переписать код так, чтобы выводило инфу на 3 и 4 строчки, но пока оставил так, как есть.

 

XManiac, есть у меня одно подозрение на счет "lcd.print("                ");". К сожалению, нормально агрументировать это не могу, ибо это на уровне "попой чую". Я бы предложил "чистить" как-нибудь иначе, либо меньшим кол-вом пробелов за раз. Вдруг поможет... чуть дальше поясню что имею ввиду. 

Из личных наблюдений:

lcd.setCursor(0,0);
lcd.print("16 пробелов");
lcd.print("какой-то текст");

Изредка может вызывать "недопечатку" последнего символа. Но это реально редко проявляется и заметить трудно. Приходится сидеть с такими глазами О_О, дабы увидеть это. 

lcd.setCursor(0,0);
lcd.print("12345");
lcd.setCursor(0,5);
lcd.print("один пробел");
lcd.setCursor(0,6);
lcd.print("еще символы");
lcd.setCursor(0,13);
lcd.print("оставшееся пустое место заполняем пробелами");

Тут недопечаток мною замечено не было. При простом форматировании текста тут не возникает проблем, но чем сложнее форматирование, тем сильнее разрастается код, и тем труднее его читать/вспоминать/редактировать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте вот так и понаблюдайте:

//Часы реал времени + дисплей  все по I2C

void ShowTime(){
..
  //lcd.print(days[dow]);  
..
}

При взгляде на фотографии сразу приходит в голову мысль, что на дисплей гонится чистейший дамп памяти из МК. 

adrift_into_infinity, может у вас не с дисплеем проблема, а с самой ардуиной? Там где-нибудь трещина...

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

sadman41, хм... ну, такое возможно... но не уж то на двух ардуинах?

Вот, сейчас покрутил обе ардуины в руках, и ничего криминального под лупой не разглядел. "Старая ардуина" с "большим" экранчиком сейчас работает (до сих пор работает, кстати!), а вторая просто не подключена ни к чему. Дорожки выглядят целыми и на той, и на другой. Во всяком случае те, что видны глазу, ибо платы "затонированы в круг" и дорожки видны аки выпуклости. Да и гребенки я лично запаивал, проводя необходимые ритуалы. Разве что слюней девственниц не нашлось вместо флюса, поэтому использовал ЛТИ-120 =) Сами гребенки тоже попробовал покачать. В итоге согнул пару пинов. Гребенка не шелохнулась...

Ну и в остальном то ардуина продолжает работать как надо, функции заданные выполняет. Черт знает что за ересь творится в этой комнате %) Теперь жду сюрприза от большого экранчика. Он, однако, уже третий день держится в комнате. Мелкие экранчики не больше 3х дней "держались" до вывода крякозябр (в лучшем случае).

- Видишь суслика?
- Нет. 
- И я не вижу. А он есть.
- Понял...

bwn
Offline
Зарегистрирован: 25.08.2014

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

sadman41
Offline
Зарегистрирован: 19.10.2016

adrift_into_infinity пишет:

sadman41, хм... ну, такое возможно... но не уж то на двух ардуинах?

У вас - не знаю. Лично у меня работают все модули с алиэкспресса и из российских инет-магазинов, за всю практику только один MH-Z19 оттопырился сразу и одна Мини Про перестала шиться. Ну, пара DC-DC еще перегрелась, но это уже я их замучал, как фашист... А у вас, может, ВЕЗЕНИЕ.

XManiac
Offline
Зарегистрирован: 21.04.2015

sadman41 пишет:

Сделайте вот так и понаблюдайте:

//Часы реал времени + дисплей  все по I2C

void ShowTime(){
..
  //lcd.print(days[dow]);  
..
}

При взгляде на фотографии сразу приходит в голову мысль, что на дисплей гонится чистейший дамп памяти из МК. 

Сделал! Спасибо! Кракозябры лезут именно после этого места! Переполняется LCD... Сам начал закоментирование... 

Но!!! непойму какая связь В I2C шлются одинаковые данные а на дисплеях (одинаковых?) выдаются разные( при том что тесты на ура.... Пичалька! Есть мысли как баг / баги вылавливать? Хочется стабильной повторяемости, себе то перемудришь/перекодишь, а кому- то, на заказ/ или далеко если... 

На фотках #68, фото 2- нормальный LCD светит 1:16 29/11/17, а фото 3- "левый" LCD тот же скетч через секунду уже 45:165  165/165...  

adrift_into_infinity пишет:

"lcd.print("                ");". 

В том то и дело что это после прочитки вставил... было просто lcd.clear(); все работало и так и так на старом/первом...это мысли проверялись...

Добавка! 

 if (hour >10){ lcd.print(' ');} lcd.print(hour, DEC);lcd.print(":");Serial.println(hour, DEC);

Подключаю старый LCD = вижу 0 (поздно, пол первого),  подключаю новый LCD = вижу 45...

WTF?

adrift_into_infinity
adrift_into_infinity аватар
Offline
Зарегистрирован: 02.10.2017

bwn пишет:

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

Питаю от старого автомобильного аккума на 80 Ач. Напряжение 12.65 сейчас (прогрелся немного). Когда он на балконе и остыл (до -1 - -2) напряжение снижается где-то на 0.3-0.4 В, но после прогрева вновь поднимается. При этом, когда на балконе аккум остыл и выдавал 12.3 В, после DC-DC преобразователя получал 8.98-8.99 В. В это же время на +5V ардуины 4.99 В. Вроде все нормально с питанием.

Еще использую несколько других аккумов при необходимости (NiMH в тепле, LiFePo4 и в тепле, и в холоде).

 

sadman41 пишет:

adrift_into_infinity пишет:

sadman41, хм... ну, такое возможно... но не уж то на двух ардуинах?

У вас - не знаю. Лично у меня работают все модули с алиэкспресса и из российских инет-магазинов, за всю практику только один MH-Z19 оттопырился сразу и одна Мини Про перестала шиться. Ну, пара DC-DC еще перегрелась, но это уже я их замучал, как фашист... А у вас, может, ВЕЗЕНИЕ.

Ну нафиг мне такое везение... Если большой экранчик не выдаст крякозябр, то, видимо, какой-то косяк с маленькими экранчиками. Посмотрим.

P.S. Большой экранчик все еще работает, идет на "рекорд"

sadman41
Offline
Зарегистрирован: 19.10.2016

XManiac пишет:

Сделал! Спасибо! Кракозябры лезут именно после этого места! Переполняется LCD... Сам начал закоментирование... 

Ни разу у меня LCD не переполнялся. А вот days[dow] вполне может указывать на char* [], который не заканчивается '\0'. И тогда print() вполне справедливо гонит в I2C всё, что прочитает из памяти MK, а там уж, поверьте, не художественные произведения сохранены. Почему так? Ну, к примеру, в days[] 7 элементов, и dow тоже принимает значение 7, начиная указывать на несуществующий "восьмой" элемент, по адресу которого и хранится дамп памяти, который летит впоследствии на LCD.

XManiac пишет:

Но!!! непойму какая связь В I2C шлются одинаковые данные а на дисплеях (одинаковых?) выдаются разные( при том что тесты на ура.... Пичалька! Есть мысли как баг / баги вылавливать? Хочется стабильной повторяемости, себе то перемудришь/перекодишь, а кому- то, на заказ/ или далеко если... 

Выводите подозрительные переменные в Serial Monitor - он-то точно не имеет трещин в конструктиве. Если туда попер мусор - дело в скетче.

XManiac пишет:

 if (hour >10){ lcd.print(' ');} lcd.print(hour, DEC);lcd.print(":");Serial.println(hour, DEC);

Подключаю старый LCD = вижу 0 (поздно, пол первого),  подключаю новый LCD = вижу 45...

Я больше удивлен тем, зачем  два раза в одной строке hour выводить на экран.

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Я больше удивлен тем, зачем  два раза в одной строке hour выводить на экран.

Контрольный, в мосх.

XManiac
Offline
Зарегистрирован: 21.04.2015

Еще раз, по буквам... Одни и теже данные на разные дисплеи!

 if (hour >10){ lcd.print(' ');} lcd.print(hour, DEC);lcd.print(":");Serial.println(hour, DEC);

эта строка в первый LCD выводит 0: в Serial 0... (время позднее)

переподключаю экран... жму Reset...

эта строка во второйLCD выводит 45: в Serial 45...

            КАК????

При этом строка

else{if (!stm){lcd.setCursor(0,3); lcd.print("Set time!    " );}}

Выводит читабельный призыв "Set time!"

Пока писал нашел ошибку в этой строке, дисплей 16х2 а установка курсора в 3-ю строку... странно но работало, исправил, все также работает... основная проблема не исчезла(

 

 
 
 
 

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Не знаю поможет-нет...
Через PCF8574 и ключи управлял несколькими реле. При включении насоса в сеть реле непредсказуемо срабатывали. Решилось подпайкой керамики по питанию к ногам микрухи.

Другой раз шимил мотор от печки Л\А, такие помехи, что читалось время с RTC 59:138 и на LCD чертичто. Убрал помеху - работает уж два года. 

Если вывод через sprintf(), то при лишнем символе в строке тоже крякозябры.
Лечу простым условием перед выводом например двузначного
if(val > 99) val = 99; //для беззнаковых - часы, минуты 

sadman41
Offline
Зарегистрирован: 19.10.2016

XManiac пишет:
if (hour >10){ lcd.print(' ');} lcd.print(hour, DEC);lcd.print(":");Serial.println(hour, DEC); ...
А... Serial. Ну, вы конечно, написали. Обфускацию еще бы провели, чтобы поинтересней читать было.
XManiac пишет:
эта строка в первый LCD выводит 0: в Serial 0... (время позднее) переподключаю экран... жму Reset... эта строка во второйLCD выводит 45: в Serial 45...
Значит hour = 45. Натыкайте Serial.println(hour) во всех местах, где с ним идет работа. Правильно ли он из часов приходит, может где-то складывается с чем попало. На дешевой ардуине нет другого способа отладки - или Serial или светодиод.

В конце концов - у вас в коде странностей хватает. Запустите, например, на своей ардуине вот это (аналогичная конструкция есть в строке 140:

 Serial.print('*'); Serial.print(' '); Serial.print('*'); Serial.println();
 Serial.print('*'); Serial.print('     '); Serial.print('*'); Serial.println();
 Serial.print('*'); Serial.print("     "); Serial.print('*'); Serial.println();

Что вышло? А ожидалось?

XManiac
Offline
Зарегистрирован: 21.04.2015

sadman41

эт здорово! что конкретно странного?

(моя строка 140= вместо строки 139 = в поиске решений...)

Pyotr

Все на столе. Вокруг на метр  никаких приборов...

To all

Еще раз!!! Одна и таже программа на двух (одинаковых?) дисплеях выдает разный результат!!!

Согласен - я кракозяблевый кодер, криворукий и косоглазый, делать то чо?

Нашел причину не знаю как решать... дисплей2 (кривой) начинает косячить после опроса часов по I2C...

Как так? Где рыть? На дисплеях одинаковые нашлепки I2C...

sadman41
Offline
Зарегистрирован: 19.10.2016

XManiac пишет:

sadman41

эт здорово! что конкретно странного?

To all

Согласен - я кракозяблевый кодер, криворукий и косоглазый, делать то чо?

Нашел причину не знаю как решать... дисплей2 (кривой) начинает косячить после опроса часов по I2C...

Как так? Где рыть? На дисплеях одинаковые нашлепки I2C...

Так что вы получили в Serial Monitor? 

На вопрос "что делать" ответ давно уже дан: или учиться или забить. Или вы думаете, что умные люди другие мозги имеют? Нет, многие гении и изобретатели сделали прорыв потратив годы на ошибки. И потом их уже не совершали.

Поменяйте местами нашлёпки. Сужайте круг, локализуйте проблемное место.

XManiac
Offline
Зарегистрирован: 21.04.2015

поправка Часы начинают косячить при подключении другого LCD(

XManiac
Offline
Зарегистрирован: 21.04.2015

sadman41 

Вы, простите, код с экрана читать научитесь, под Вас не очень удобно обфусцировать....

 

Всем спасибо, проблема решена!