Найти в Дзене
Паяльник

Дисплей с часами и температурой для измерителя параметров сети

Эта статья - продолжение моей предыдущей статьи. Там же и технические решения. Мне попался измеритель тока, напряжения и мощности (далее ИТНМ) PZEM-016.
Данный измеритель должен был подключаться к трансформатору тока (ТТ) на
100 А, но мне он достался без ТТ, поэтому пришлось заказывать отдельный
ТТ на 30 А. Его вы и можете увидеть на фотографии ниже. Измеритель
имеет ModBus RS485 интерфейс и вывод +5 В, что пригодится для питания
дисплея. Само же устройство основано на той же самой плате, которую я
заказывал прошлый раз. К нему добавились некоторые дополнительные
устройства: Принципиальная схема устройства: Плата с микросхемой часов соединяется через штырьковый разъём и
получается некий "бутерброд", датчик температуры и подтягивающий
резистор запаян методом колхозинга. На самой плате слева виден разъём для дисплея, переменный резистор
для контраста, возле него два резистора подтяжки 4 кОм шины I2C,
микросхема памяти, ниже микроконтроллер, ниже диод для подсветки,
кнопка, и

Эта статья - продолжение моей предыдущей статьи. Там же и технические решения.

Мне попался измеритель тока, напряжения и мощности (далее ИТНМ) PZEM-016.
Данный измеритель должен был подключаться к трансформатору тока (ТТ) на
100 А, но мне он достался без ТТ, поэтому пришлось заказывать отдельный
ТТ на 30 А. Его вы и можете увидеть на фотографии ниже. Измеритель
имеет ModBus RS485 интерфейс и вывод +5 В, что пригодится для питания
дисплея.

Само же устройство основано на той же самой плате, которую я
заказывал прошлый раз. К нему добавились некоторые дополнительные
устройства:

  1. Микросхема памяти M24M01, представляет из себя 1 Мбит I2C
    память. Изначально планировал использовать как логер. И даже написал
    что-то, но потом стало не интересно. Кому интересно может допилить. Я
    даже сделал передачу содержимого из микросхемы по Z-modem.
  2. Микросхема, датчик температуры Dallas 18B20, ну это классика.
    Единственно, не знаю почему, но микросхема завышает на пару градусов.
    При этом после включения – ок, но спустя некоторое время измеряемая
    температура растёт. Вроде бы сделал опрос датчика каждые 10 сек., но
    проблема осталась. Может быть проблема заключается в поддельности
    сенсора, но не принципиально.
  3. Модуль часов на микросхеме DS1302. Тут надо остановиться что
    микросхема имеет не I2C интерфейс, а очень похожий. Эта микросхема
    подключена параллельно микросхеме памяти и выводы микроконтроллера
    переключаются между I2C и обычными вводами/выводами по ходу работы
    микроконтроллера.
  4. Питание микроконтроллера сделано через стабилизатор 7805, но в
    данном случае 5 вольт подаётся от ИТМ, поэтому защитный диод и 7805
    зашунтированы, но на схеме эти элементы остались

Принципиальная схема устройства:

-2

Плата с микросхемой часов соединяется через штырьковый разъём и
получается некий "бутерброд", датчик температуры и подтягивающий
резистор запаян методом колхозинга.

-3

На самой плате слева виден разъём для дисплея, переменный резистор
для контраста, возле него два резистора подтяжки 4 кОм шины I2C,
микросхема памяти, ниже микроконтроллер, ниже диод для подсветки,
кнопка, и разъём программирования. Я использую PICKIT2. В середине
драйвер и разъём шины RS485. В левом углу микросхема датчика
температуры, посередине разъём питания с конденсатором и стабилизатор
питания. В собранном виде, данная конструкция представлена:

-4

ИТНМ имеет вход напряжения – это фазное напряжение 80 -260 В и
частота 50/60 и вход тока подключается к различным ТТ, максимальный ТТ
на 100 А, но я заказал на 30 А. Для моих применений вполне достаточно.
На выходе ИТНМ есть +5 В и RS485 интерфейс. RS485 имеет скорость 9600,
протокол ModBus.

Режим работы следующий:

При включении настраивается вся периферия, на экран выводится
заставка CXEM.NET, при этом микроконтроллер посылает запрос на порт
RS485 на установку часов. Если при этом к устройству подключено slave
устройство с адресом 1, то соответственно происходит установка часов в
соответствии со следующими регистрами:

0 Секунды

1 Минуты

2 Часы

3 День

4 Месяц

5 День недели

6 Год

При установке времени в левом нижнем углу высвечивается буква “V”, от английского слова verification.

-5

На скриншоте показана программа ModBus Slave с данными для установки
времени. Необходимо отметить что Slave устройство для установки времени
должно иметь Slave Id = 1. Остальные настройки можно увидеть на
картинке.  По идее в это время микроконтроллер ждёт запроса по Zmodem и
будет перекачивать данные из микросхемы памяти в компьютер. Но как я
написал выше это я не доделал. Кто захочет дерзайте. Все исходники
внизу.

В EEPROM память микроконтроллера записывается как количество
включения/отключения с выводом на экран. Так и дата и температура
включения, указатель откуда начинать записывать в микросхему памяти.

Затем программа переходит в основной цикл в котором происходит
периодический опрос температуры, данных с ИТНМ, время. Всё это
показывает на дисплее, при этом происходит запись значения тока в
микросхему памяти побайтно. Если ток более 25.5 А то записывается 0,
если меньше то значение умножается на 10 и округляется. Делается это,
естественно, в целях экономии чтобы 4 байта уложить в 1 байт памяти.

Регистры ИТНМ представлены ниже:

-6

Запрос данных происходит посылкой следующих данных в порт:

static char request_values[8] = {0x0a, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x71, 0x76};

Здесь видно следующие данные:

0x0a - это адрес слэйв устройства, в нашем случае это 10ый,

0x04 - 4-ая функция, то что мы будем читать регистры, каждый регистр 2-х байтный

0x00, 0x00 - начало откуда будем читать

0x00, 0x0A - количество регистров которые хотим прочитать, соответственно регистры с 0 до 10

0x71, 0x76 - контрольная сумма.

Приём данных происходит в прерывании и парсинг происходит там же по приёму всех данных:

if (number_received == 17 && currently == get_time && checkCRC(recive,17)==0) {     //Установка времени

DS1302_1init();

DS1302_Initialize(recive[4],recive[6],recive[8],recive[10],recive[12],recive[14],recive[16]);

T0CON=0b10000110;

TMR0=0;

TMR0IF=0;

TMR0IE=1;

correct = 0X12;

currently = get_values;//

return;

}

if (number_received == 25 && currently == get_values && checkCRC(recive,25)==0 ) {  //запрос данных

Voltage = (recive[4] | ((uint16_t)recive[3] << 8));

Current =  ((uint16_t)recive[5] << 8) | recive[6];

Power =  ((uint32_t)recive[11] << 24) | ((uint32_t)recive[12]<<16) | ((uint16_t)recive[9] << 8) | recive[10];

Energy = ((uint32_t)recive[15] << 24)| ((uint32_t)recive[16] <<16) | ((uint16_t)recive[13] << 8) | recive[14];

frequency = (recive[18] | ((uint16_t)recive[17] << 8));

power_facor=(recive[20] | ((uint16_t)recive[19] << 8));

delay_connection= 5; // update the time of connection

return;

}

Тут приём двух пакетов, первый для установки времени. Второй пакет -
парсинг данных от ИТНМ. Происходит проверка CRC поэтому случайный пакет
проскочить не должен.

-7

Работающий дисплей можно увидеть выше. В принципе, всё должно быть
понятно. Когда ИТНМ находится на связи в левом углу происходит некая
анимация, точка превращается в окружность и обратно.

В прикрепленных файлах схема и плата в формате DipTrace, исходники для программирования микроконтроллера.

Прикрепленные файлы:

Автор: Mesha