Термистор + дисплей от Nokia 1100...

Тема в разделе "Глядите, что я сделал", создана пользователем nik1311, 3 окт 2012.

  1. nik1311

    nik1311 Нерд

    Решил я наконец изучить, как работают аналоговые порты. По случаю под рукой оказался термистор от корпусного вентилятора, а также заброшенный до лучших времен дисплей от Nokia 1100, с кодом для которого я разбирался полгода назад.
    С формулой преобразования U -> T заморачиваться не стал, взял код, найденный на форуме, поэтому точность вряд ли высока.
    Сперва задача стояла на первый взгляд простая: вывести температуру в float на дисплей. И тут началось самое интересное... Дело в том, что функция печати на дисплей принимает параметр-строку. Ну я, не долго думая, написал...
    Код (Text):
    sprintf(str, "%f", temp);
    PrintStr(str);
    ...на что экран ответил:
    Код (Text):
    ?
    Я подумал, может что не то с кодом для экрана, решил проверить через Serial, результат оказался аналогичен. Причем если в sprintf печатать int, то все корректно. В общем, долго я пытался это преодолеть, но без толку. В итоге пришлось сделать коряво:
    Код (Text):
    d = trunc(temp);
    f = trunc((temp - trunc(temp)) * 10);
    sprintf(str, "%d.%d", d, f);
    Разобравшись с выводом самой температуры, я решил, что надо как-то задействовать оставшуюся часть экрана, и придумал выводить на нее график изменения температуры. Реализовал я это с помощью массива величиной с ширину экрана, в который каждый цикл обновления все значения сдвигаются на одну ячейку к началу, а в последний элемент пишется текущая температура.
    Так как я хотел, чтобы сами циферки температуры обновлялись постоянно, а график быстро не уползал, обновление массива для графика происходит только через заданный промежуток времени. Реализовал я это через функцию millis() - сравниваю ее с предыдущим временем обновления, и если прошло больше заданного времени - обновляю, иначе вывожу старый массив.
    Ну и потом просто решил добавить в уголке min и max температуры.
    В итоге, алгоритм обновления экрана такой:
    Код (Text):
    Пишем температуру, min, max;
    Рисуем разметку графика;
    Выводим массив графика;
    Обновление экрана(в этот момент на экране рисуется все что было выше);
    Очистка экрана;
    WP_000357.jpg WP_000363.jpg
    Теперь можно поставить на ночь мониторить температуру... Чтоб график обновлял каждые 10 минут, тогда на экран влезет часов 16...
    Ну и еще в планах сделать так, чтоб при выходе значения за пределы данной шкалы, чтоб шкала смещалась. И доделать поточнее преобразование из аналогового сиганала в температуру.
     
    HighDigital и Megakoteyka нравится это.
  2. nailxx

    nailxx Официальный Нерд Администратор

    Выглядит очень мило!
     
  3. nik1311

    nik1311 Нерд

    Вот что получилось за ночь:
    WP_000366.jpg
    интервал обновления графика выставил 7.5 минут, в ширину 96 точек, так что здесь должен быть 12 часовой лог. В конце резкий спад - утром открывали балкон проветрить.
    У меня есть еще такой же термистор, можно вытащить его на улицу, и рисовать сразу с двух, t внутри и снаружи :)
    Может еще кнопочки добавить для смены вида и смены интервала...
    А еще вчера наткнулся на статью про подключение SD, выяснил, что подключается очень просто, нужны только резисторы, а у меня как раз есть разъем от умершего ноута, так что можно сделать, чтоб лог писался на карточку.
     
  4. iwizard7

    iwizard7 Нерд

    Здравствуйте, не поделитесь скетчем?
     
  5. nik1311

    nik1311 Нерд

    Скетчем всей этой штуки или просто чтоб этот дисплей подключить?
     
  6. iwizard7

    iwizard7 Нерд

    Да, хотелось бы полностью , дисплей я уже успешно подлючил хотелось бы понять как строится график. Буду очень благодарен :)
     
  7. HighDigital

    HighDigital Гик

    + 1, поделитесь пожалуйста :)
    P.S лучше файлом/архивом
     
  8. nik1311

    nik1311 Нерд

    В общем я особо не заморачивался с кодом, в начале идет описание всех функций для дисплея, это большая часть скетча, и в самом конце уже непосредственно рисование. Насколько я помню y[x] у меня это как раз массив, в котором график хранится.
     

    Вложения:

  9. wall-e

    wall-e Нуб

    А можно выложить библиотечку для 1101 и подключение если не трудно
     
  10. nik1311

    nik1311 Нерд

    Библиотеки нет, все описано в самом скетче и подключение тоже вроде как.
    А в 1101 не такой же дисплей как и в 1100?
     
  11. wall-e

    wall-e Нуб

    Простите-не догадался текст программы взглянуть
     
  12. HighDigital

    HighDigital Гик

    У меня б сил не хватило все это вручную писать ;)
     
  13. nik1311

    nik1311 Нерд

    Саму организацию работы дисплея я и не писал, нашел в сети, только пришлось в ней копаться, т.к. там ошибки были:)
     
  14. Unixon

    Unixon Оракул Модератор

    А это всегда так. Сначала "ох же блинский блин, сколько тут наворочено то! вот чтоб я так - да никогда...". Потом, через некоторое количество дофигавремени усердного ковыряния, ба-бах! выходит поделка. И неказистая вроде и там косяк и тут еще доделать можно и пару скелетов в тумбочках припрятано... А потом через год-два-пять смотришь на нее и удивляешься: "ох же нифига себе я тогда штуковину отгрохал! это ж мне в жизнь не повторить больше такого...".
     
    lerik2703, HighDigital и Megakoteyka нравится это.
  15. Максим B

    Максим B Гуру

    А реально подключить дисплей от Nokia 6300?? Или еще какого-нибудь телефона??
     
  16. iwizard7

    iwizard7 Нерд

    Я думаю вполне реально, только нужно знать алгоритм работы его и распиновку, попробуйте погуглить, возможно уже кто то делал
     
  17. H`UGO

    H`UGO Нуб

    Ко-о-ошмар о_О. Размер кода почти 10К. Там все что ... попадали!? Пока не тестил но просмотрев бегло, думаю % на 15 можно сократить и всунуть в Atmega8, если конечно РАМ-ы хватит. Автору топа респект. Исходник что надо и пофантазировать можно.
    P.S. Для ГУГЛ-щиков - В одноименных дисплеях 1202, 1280 эдентичный контроллер на 100% подходит только поменяйте в исходнике разрешение по высоте (не 65, а 68) иначе 3 последних "ряда" будут пустовать.
     
    Последнее редактирование: 13 окт 2013