Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Ненавязчивая автоматизация ректификационной установки

Форум самогонщиков Автоматика
1 ... 36 37 38 39 40 41 42 ... 132 39
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.760  07 Нояб. 17, 20:17
а зачем нужен четырёхразрядный индикатор? Чтобы видеть на платке сотые градуса? Мне достаточно трёх разрядов на показометре. Тогда пины Д9 и Д10 свободны для датчиков. Хотя можно и А3 сконфигурировать, как цифровой.JackB, 07 Нояб. 17, 16:46

Если можно, для полноты картины, поставить 4 разряда, почему бы не поставить?
Вот схемка
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Все по фэншую, и 5 датчиков, и 4 индикатора.
Проверю на днях скетч, и платку выложу
JackB Специалист Kazan 101 44
Отв.761  08 Нояб. 17, 10:17
BogAD, хорошее решение.
Тогда пины Д9 и Д10 свободны для датчиков. Хотя можно и А3 сконфигурировать, как цифровой.JackB, 07 Нояб. 17, 16:46
я имел ввиду доработку уже имеющегося модуля.

Делаю автоматику себе для дистилляции на основе концепции OldBean с сотоварищами. 4 канала температуры, 5 клапанов. Алгоритм дистилляции сахарного НДРФ с использованием ЦП, 750+375 и ПБ взял у уважаемого коллеги Esc. Работа сейчас в процессе отладки ПО на железе.
Сорри за оффтоп.
OldBean Доцент Красноярск 1K 1.4K
Отв.762  08 Нояб. 17, 17:46
BogAD, для 5 датчиков и 4-разрядного индикатора лучше используйте вариант, как на схеме ниже:
 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Причины две:
1. DS-ки лучше подключать к пинам одного порта (в данном случае - D), чтобы управлять всеми датчиками сразу одной командой записи/чтения. У ардуинки выводы D9 и D10 (как в Вашем варианте) - это уже пины порта B.
2. Добавочный резистор 470 (от 4-й цифры индикатора D4) все равно навесной и не требует жесткой (монтажной) привязки вывода индикатора к выводу ардуинки. Поэтому его легко перекинуть на другой ряд (например, к A3, как показано на схеме красным)
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.763  08 Нояб. 17, 19:40
это уже пины порта BOldBean, 08 Нояб. 17, 17:46
"ТШОРТ ПОБЭРИ"...
Вот что значит взор Сэнсэя!!!
Сергей, спешно исправляюсь. Подмигивающий


Добавлено через 10мин.:

Сергей, конечно не принципиально, но с точки зрения "надписи есть и не надо проверять? ", бросается в глаза, что ноги TXD/D1 и RXD/D0 не в той последовательности по трассировке плат pro mini.
OldBean Доцент Красноярск 1K 1.4K
Отв.764  09 Нояб. 17, 02:58
ноги TXD/D1 и RXD/D0 не в той последовательности по трассировке плат pro mini.BogAD, 08 Нояб. 17, 19:40
Да. Здесь есть небольшая путаница, которая может смутить. Я изобразил принципиальную схему (правда, очень похожую на монтажную :). Поэтому пины упорядочены логически: PD0, PD1, Pd2 и т.д. Точно так, как на самих чипах AVR-ок. На плате Arduino Pro Mini пины PD0 и PD1 переставлены местами (относительно схемы самого чипа). Это просто нужно помнить. Хотя, для подключения DS-ок это совсем не важно.
ZagAl Доцент Прибалтика 1.9K 916
Отв.765  09 Нояб. 17, 21:04
OldBean, хочу попросить выложить скетч для температурного сервера в варианте Lite в формате *.ino
Для Arduino Pro Mini в нем ничего же переделывать не нужно?
U-M Магистр MSK 210 39
Отв.766  09 Нояб. 17, 21:43, через 40 мин
Из [сообщение #13040384] аттач firmware.zip в среде ардуины версии 1.8.3 компилируется без ошибок (вот как есть) - единственное, наверное надо перепроверить назначенные выводы под свое железо. Забыл - файл main.c надо смотреть.
ZagAl Доцент Прибалтика 1.9K 916
Отв.767  09 Нояб. 17, 22:00, через 18 мин
- Ах, да, мой друг, по поводу обещанного масла…
Хотите ли попробовать на завтрак мармелад?...
Дело в том, что к *.ino файлам я уже приноровился. А вот как поступать с *.hex файлами в Win требует дополнительных разъяснений. Для меня было бы предпочтительнее не задавать вам лишних вопросов, а просто подкорректировать и загрузить *.ino файл.
U-M Магистр MSK 210 39
Отв.768  09 Нояб. 17, 22:04, через 4 мин
Ой, он же обычный текстовый, просто расширение .с


Скрытый текст//-----------------------------------------------------------------------------
// Температурный сервер на базе ATMega328P и датчков DS18B20
// Файл main.c
// OldBean, 27.05.2017
//-----------------------------------------------------------------------------
// Прилагаемый makefile ориентирован на компилятор avr-gcc, "прошивка" - при
// помощи USBAsp-программатора и утилиты avrdude.
// При работе с makefile можно использовать следующие команды:
//  Компиляция и подготовка hex-файла: make
//  Компиляция и последующая прошивка ATMega328P: sudo make flash
//-----------------------------------------------------------------------------
// Температурный сервер представляет собой микроконтроллер ATMega328P
// с подключенными к пинам порта PD датчиками температуры DS18B20 (не более
// одного на каждый пин, т.е. всего до 8 датчиков).
//
// Каждый пин PD, к которому подключен датчик, имеет подтягивающий резистор
// 4.7k и образует, таким образом, независимую шину 1-Wire с единственным
// ведомым устройством. Управление всеми этими шинами происходит синхронно.
// ID - датчиков  DS18B20 не используются. Никак. Датчики нумеруются
// соответственно номерам пинов порта PD (от 0 до 7), к которым они подключены.
// Т.е. датчик, поключенный, например, к PD0 имеет номер 0.
//
// Tемпературный сервер связан с внешним миром по шине I2C как ведомое (slave)
// устройство с адресом 0x07 (может быть изменен перед компиляцией - константа
// ADDR).
//
// Протокол прикладного уровня выглядит следующим образом:
//
// 1. Мaster на шине I2C (например, малинка) отправляет по адресу сервера 0x07
//    байт, равный 0x44. Это число интерпретируется сервером как команда.
// 2. Сервер, получив эту команду, запускает цикл преобразования всех
//    подключенных к нему датчиков DS18B20 и, на время пока происходит
//    преобразования, перестает откликаться на запросы к нему по шине I2C.
// 3. После завершения преобразования, сервер разрешает доступ к нему по шине
//    I2C для считывания данных (измеренных температур) или - для очередного
//    запуска преобразования датчиков.
// 4. В этой версии сервера, данные считываются одним блоком. Например, при
//    помощи функции read_i2c_block_data питоновского модуля smbus. Блок
//    представляет собой последовательность 17 байтов, содержащих следующую
//    информацию:
//      1-й байт - битовая маска наличия датчиков на шинах 1-Wire (1 - датчик
//                есть, 0 - датчик отсутствует). Номерация датчиков
//                соответствует нумерации пинов порта PD (от 0 до 7), к
//                которым подключаются датчики.
//      2 и 3 байты - слово, содержащее код температуры 0-го датчика (пин 0 МК).
//                Старший байт - первый. Температура в °C получается путем
//                умножения этого кода на 0.0625
//      4 и 5 байты - код температуры следующего датчика (с номером 1) и так
//                далее... Если датчик отстутсвует, то код равен 65535.
//-----------------------------------------------------------------------------
#include <avr/io.h>
#include <compat/twi.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define ADDR 0x07    // Адрес сервера на шине I2C
#define READY 0    // Устройство доступно по I2C, данные готовы
#define BUSY  1    // Устройство занято - измеряет температуры

uint8_t mode = READY;  // Режим работы устройства
uint8_t index = 0;
uint8_t buf[17];
uint8_t bufL = 17;
// На данный момент задействованы все пины порта PD. Если какие-нибудь пины
// необходимо использовать для других целей (например, PD0/RXD и PD1/TXD), то
// их необходимо замаскировать (например, для только что приведенного
// примера - mask1 = 0b11111100; mask0 = 0b00000011;
uint8_t mask1 = 0b11111111; // Все 8 пинов порта PD могут быть использованы в
                            // качестве шин 1-Wire.
uint8_t mask0 = 0b00000000; // mask0 = ~mask1
uint8_t bytes[8];
//-----------------------------------------------------------------------------
ISR(TWI_vect) { // Обработка прерываний TWI
  unsigned char status = TWSR & 0b11111000; // Статус - в старших 5 битах
  cli(); // Запрещаем прерывания
  switch(status) { // Анализируем статус TWI
//    case TW_SR_SLA_ACK: // 0x60
    case TW_SR_DATA_ACK:    // 0x80
//    case TW_SR_STOP: // 0xA0
      if(TWDR == 0x44) { // Команда запуска цикла преобразования датчиков
        mode = BUSY;
        TWCR &= ~(1<<TWEA);
      }
      break;
    case TW_ST_SLA_ACK: // 0xA8
      index = 0;
      TWDR = buf[index];
      break;
    case TW_ST_DATA_ACK:    // 0xB8
      if(++index < bufL) {
        TWDR = buf[index];
        if(index == bufL - 1) // Последний байт
          TWCR &= ~(1<<TWEA); // Не работает! Разобраться...
//          PORTC |= 0b00000010;
      } else TWDR = 255;
      break;
    case TW_ST_DATA_NACK:  // 0xC0: данные отправлены, принят NACK
    case TW_ST_LAST_DATA:  // 0xC8: последний байт отправлен, ACK принят
      TWCR |= (1<<TWEA);
//      PORTC |= 0b00000100;
      break;
    default:
      break;
  }
  TWCR |= (1<<TWINT); // Очищаем флаг TWINT
  sei(); // Разрешаем прерывания
}
//-----------------------------------------------------------------------------------------------------------
uint8_t w1_reset() { // Сброс всех шин 1-Wire и обнаружение подключенных к ним датчиков
//  cli(); // Запретим прерывания
  DDRD |= mask1; // Пины шин - на вывод
  PORTD &= mask0; // Установим низкий уровень на всех шинах 1-Wire
  _delay_us(480);
  DDRD &= mask0; // Пины шин - на ввод
  _delay_us(60);
  uint8_t devs = ~(PIND | mask0); // Там, где есть датчик - будет 1
  _delay_us(420); //ждем оставшееся время до 480мкс
  return devs;
//  sei(); // Разрешаем прерывания
}
//-----------------------------------------------------------------------------------------------------------
void w1_write_byte(uint8_t b) { // Отсылаем один и тот же байт на все шины
  uint8_t mask = 0b00000001;
  for(uint8_t bit = 0; bit < 8; bit++) {
//    cli(); // Запретим прерывания
    DDRD |= mask1; // Пины шин - на вывод
    PORTD &= mask0; // 0 на всех шинах 1-Wire
    _delay_us(1);
    if(b & mask) // Шлем единичку
      DDRD &= mask0; // "Отпустим" шины - переводем порт в режим чтения
    _delay_us(59);
    DDRD &= mask0;
    _delay_us(5);
    mask <<= 1;         
//    sei(); // Разрешаем прерывания
  }
}
//-----------------------------------------------------------------------------
void w1_read_bytes(uint8_t *b) { // Чтение байтов со всех шин 1-Wire
  uint8_t wb[8]; // Вспомогательный массив, который заносятся читаемые биты.
                // Каждый байт wb содержит соответствующие биты всех датчиков.
                // Например, wb[3] содержит 3-и биты всех датчиков.
//  cli(); // Запретим прерывания
  for(uint8_t bit = 0; bit < 8; bit++) {
    DDRD |= mask1; // Пины шин - на вывод
    PORTD &= mask0; // 0 на всех шинах 1-Wire
    _delay_us(1);
    DDRD &= mask0; // Пины шин - на ввод
    _delay_us(14);
    wb[bit] = PIND & mask1; // Читаем все биты с номером bit
    _delay_us(45);
  }
  _delay_us(5);
  // Преобразуем полученную информацию (массив wb) к нормальной форме, чтобы
  // каждый байт содержал все биты, полученные от одного датчика. По сути,
  // нам нужно просто транспонировать матрицу 8x8, представленную массивом wb.
  uint8_t bmask = 0b00000001;
  for(uint8_t bit = 0; bit < 8; bit++) {
    uint8_t nmask = 0b00000001;
    for(uint8_t sn = 0; sn < 8; sn++) {
      if(buf[0] & nmask) { // Датчик на этой шине есть
        if(wb[bit] & nmask) b[sn] |= bmask; // Установим бит
        else b[sn] &= ~bmask; // Сбросим бит
      } else b[sn] |= bmask; // Если на шине нет датчика - будут все 1
      nmask <<= 1;
    }
    bmask <<= 1;
  }
//  sei(); // Разрешаем прерывания
}
//-----------------------------------------------------------------------------
int main(void) {
  // Порт C используется для индикации и отладки
  DDRC |= 0b00000111;
  PORTC &= 0b11111000;

  DDRD |= mask1; // Пины шин - на вывод
  PORTD |= mask1; // Отпускаем все шины

  // Инициализация TWI
  TWAR = ADDR<<1; // Установка адреса (старшие 7 бит TWAR)
  TWCR = (1<<TWINT) | // Сбросим флаг TWINT
        (1<<TWEA)  | // Разрешаем подтверждение адреса
        (1<<TWEN)  | // Разрешаем работу TWI
        (1<<TWIE);

  sei(); // Разрешаем прерывания
  while(1) {
    if(mode == BUSY) { // Измеряем температуры
      PORTC |= 0b00000001; // Индикация - "Занято"
      uint8_t devs = w1_reset() & mask1;
      if(devs) { // Датчики есть
        buf[0] = devs; // Информация о наличии датчиков - в первом байте
        w1_write_byte(0xcc); // Skip ROM
        w1_write_byte(0x44); // Запускаем все датчики
        _delay_ms(800); // Задержка не менее 750 мс
        w1_reset();
        w1_write_byte(0xcc); // Skip ROM
        w1_write_byte(0xbe); // Будем читать температуры
        w1_read_bytes(bytes);
        for(uint8_t i = 0; i < 8; i++)
          buf[2 + 2*i] = bytes;
        w1_read_bytes(bytes);
        for(uint8_t i = 0; i < 8; i++)
          buf[1 + 2*i] = bytes;
        w1_reset();
      }
      TWCR |= (1<<TWEA);
      mode = READY;
    } else {
      PORTC &= 0b11111110; // Индикация - "Готово"
    }   
  }
}
//-----------------------------------------------------------------------------


OldBean Доцент Красноярск 1K 1.4K
Отв.769  10 Нояб. 17, 05:11
хочу попросить выложить скетч для температурного сервера в варианте Lite в формате *.ino
Для Arduino Pro Mini в нем ничего же переделывать не нужно?ZagAl, 09 Нояб. 17, 21:04
К сожалению, файла *.ino у меня нет.

Т-сервер для LITE не имеет индикатора и кнопки (см. рисунок во вложении). Код для него пишется на Си. Но в сервере используется ATMega328. Поэтому код, естественно, будет полностью совместим с Arduino Pro Mini. Если с ней работать как с мегой. В принципе, из сишного кода сделать файл *.ino не сложно. Никаких изменений в логике кода не понадобится. Хорошо. Я предусмотрю такую возможность. Но, к сожалению, сам код на Си еще не готов. Разработка варианта LITE продолжается. Но урывками и с большой скважностью из-за сильного дефицита свободного времени :( Но, надеюсь, так будет не всегда :)
dig_mod.JPG
dig_mod.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
Dmitry68 Специалист Уфа 194 102
Отв.770  11 Нояб. 17, 08:47
Надоело мне постоянно наклоняться и присматриваться к термометрам, да включать их каждые 10 минут.
Передаю теперь по блютуху на планшет или смартфон. Цена вопроса - 500р.(не считая планшета) и один час свободного времени.
IMG_20171111_030131.jpg
IMG_20171111_030131.jpg Ненавязчивая автоматизация ректификационной установки. Автоматика.
Петрович31 Доктор наук Белгород 960 527 2
Отв.771  11 Нояб. 17, 09:07, через 21 мин
Dmitry68, а поподробнее можно???я тоже хочу за 500 рубликов 
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.
Dmitry68 Специалист Уфа 194 102
Отв.772  11 Нояб. 17, 09:30, через 23 мин
Вот так примерно.
Screenshot_2017-11-11-10-52-57-449_com.alibaba.aliexpresshd.png
Screenshot_2017-11-11-10-52-57-449_com.alibaba.aliexpresshd.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
Screenshot_2017-11-11-10-52-51-425_com.alibaba.aliexpresshd.png
Screenshot_2017-11-11-10-52-51-425_com.alibaba.aliexpresshd.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
Screenshot_2017-11-11-10-51-26-132_com.alibaba.aliexpresshd.png
Screenshot_2017-11-11-10-51-26-132_com.alibaba.aliexpresshd.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
Dmi_D Кандидат наук Минск 393 138
Отв.773  11 Нояб. 17, 16:49
Вот так примерноDmitry68, 11 Нояб. 17, 09:30
Тезка, не томи...
Разрисуй в подробностях хард и софт, тут масса желающих повторить твой опыт.
Это получается как раз та промежуточная ступень между дискретными измерениями и автоматизацией всего процесса.
Ждем-с
Dmitry68 Специалист Уфа 194 102
Отв.774  11 Нояб. 17, 16:57, через 9 мин
Хард разрисован в картинках, тех, что скинул. Софт - программа "virtuino" с маркета. По этому же слову "virtuino", на Ютубе сразу же находится подробное описание всего процесса от разработчика.. От подключения плат, до настройки интерфейса программы. Правда на греческом языке)). Но он сопровождает все это безобразие, достаточно понятным видеорядом. Даже я, весьма далёкий от программирования, достаточно просто во всем разобрался. Если будут вопросы - пишите, с удовольствием помогу.
OldBean Доцент Красноярск 1K 1.4K
Отв.775  11 Нояб. 17, 18:03
В общем-то в Сети много вариантов беспроводных термометров на базе Arduino, DS-ок и чего-нибудь беспроводного (BT, Wi-Fi и т.п.) для связи с гляделкой (планшет, телефон и т.п.). Используются для умных домов, метеостанций и т.п. Можно просто погуглить типа: DS18B20 Arduino Wi-Fi... и выбрать решение, которое понравится. Не обязательно на греческом... :)
Dmitry68 Специалист Уфа 194 102
Отв.776  11 Нояб. 17, 18:19, через 16 мин
Да, конечно. Но мне очень понравился гибкий интерфейс программы андроид. Можно настроить все на свой вкус. И не только отображение датчиков. Много вариантов кнопок, регуляторов, графиков...
OldBean Доцент Красноярск 1K 1.4K
Отв.777  12 Нояб. 17, 05:30
Много вариантов кнопок, регуляторов, графиков...Dmitry68, 11 Нояб. 17, 18:19
Ну это - на любителя. А вот сама идея беспроводных датчиков вполне рациональна. Найти надежное, недорогое, компактное, беспроводное и автономное (от батарейки) решение для DS-ок было бы интересно. Не знаю как кого, но меня гирлянда проводов на колонне (от DS-ок) временами сильно раздражает. Особенно, когда начинаешь снимать колонну, забыв отцепить шины. Ну явный кандидат на "ненавязчивое" решение! :)
ys1797 Доцент Санкт-Петербург 1K 338
Отв.778  12 Нояб. 17, 15:02
OldBean,
https://ru.aliexpress.com/...-75c690a9ef7a-0

Или так:
https://ru.aliexpress.com/...a7-7ff1ed091c07
U-M Магистр MSK 210 39
Отв.779  12 Нояб. 17, 20:30
Как вариант - на колонне закрепить один блок, в который входят провода от датчиков, в нем температурный сервер+батарейка+передатчик. Вопрос прожорливости схемы и помехозащищенности канала данных.
И датчик куба в такой конструктив не у всех может вписаться?