Автохолодильник

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Добрый день. Выкладываю свой простенький проект.

Суть простая. Есть пассивный автохолодильник. Сам проектировал, сам собрал тестовый вариант. Хотя откатал с ним два сезона уже. Не стал применять для охлаждения что-либо, исключительно сама конструкция, изоляционные материалы и хладоаккумуляторы. Характеристики получились приличные: 12 часов до моря – коньяк всего +10, при этом 4 раза останавливались на перекус, а значит открывали холодильник. (Кому нужно, есть полный расклад по сборке и материалам в PRO100)

От лирики к сути. Захотелось наблюдать что и как в холодильнике не открывая его.

Выкладываю схему. Решил всё построить на 3-х вольтовой логике, в принципе все элементы это позволяют делать. Единственное – экран: на если выкрутить яркость на полную, то никаких проблем нет.

На входе стоит стабилизатор на 3,3 вольта. Мозг всего ATMEGA 328P. Решил отказаться от Arduino (как говориться, пора расти). Минимум обвязки взял из доков. Далее цепляю два датчика температура/влажность и фоторезистор. Ну и всё вывожу на Экран. Ну и обычный экранчик 16х2 с конвертором на I2C.

// Подключаем библиотеку для работы с шиной I2C
#include <Wire.h>
// Подключаем библиотеку для работы с LCD дисплеем по шине I2C
#include <LiquidCrystal_I2C.h>
// Подключаем библиотеку для работы с датчиком температуры/влажности
#include <iarduino_DHT.h>

// Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Объявляем объект dht1, указывая номер вывода, к которому подключён 1 модуль
iarduino_DHT dht1(3);
// Объявляем объект dht2, указывая номер вывода, к которому подключён 2 модуль
iarduino_DHT dht2(4);

//  Объявляем массив собственных символов
uint8_t symbol_arr[16][8] = {
  {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000}, // 0  - Пустой символ
  {B11000, B11000, B00110, B01001, B01000, B01001, B00110, B00000}, // 1  - Знак цельсия
  {B10001, B10001, B10001, B01111, B00001, B00001, B11110, B00000}, // 2  - У
  {B00000, B00000, B00111, B01001, B10001, B10001, B10001, B00000}, // 3  - л
  {B00000, B00000, B10010, B10010, B10010, B10010, B01111, B00001}, // 4  - ц
  {B00000, B00000, B01111, B10001, B10001, B01111, B00001, B11110}, // 5  - д
  {B00000, B00000, B10000, B10000, B11110, B10001, B11110, B00000}, // 6  - ь
  {B00000, B00000, B10001, B10001, B11111, B10001, B10001, B00000}, // 7  - н
  {B00000, B00000, B10001, B11011, B10101, B10001, B10001, B00000}, // 8  - м
  {B00000, B00000, B01111, B10001, B01111, B01001, B10001, B00000}, // 9  - я
  {B00000, B00001, B01110, B10000, B11110, B10001, B01110, B00000}, // 10 - б
  {B00000, B00000, B11111, B00100, B00100, B00100, B00100, B00000}, // 11 - т
  {B00000, B00000, B10001, B10001, B11101, B10011, B11101, B00000}, // 12 - ы
  {B00000, B00000, B10010, B10010, B01110, B00010, B00011, B00000}, // 13 - ч
  {B00000, B00000, B11110, B10001, B11110, B10001, B11110, B00000}, // 14 - в
  {B00010, B00100, B10001, B10001, B10001, B10011, B01101, B00000}, // 15 - й
};

// Точка отчёта для снятия данных с датчиков
unsigned long time_sensor;
// Время обращения к датчикам
const unsigned long time_sensor_query = (unsigned long)60 * 1000;

// Точка отчёта для подсветки экрана
unsigned long time_screen;
// Время подсветки экрана
const unsigned long time_screen_query = (unsigned long)20 * 1000;

// Точка отчёта для смены экрана
unsigned long time_changer;
// Время смены экрана
const unsigned long time_changer_query = (unsigned long)3 * 1000;
bool screen1 = true;
bool screen2 = true;
bool screen3 = true;
bool screen4 = true;

// Точка отчёта для времени открытия
unsigned long time_open;
// Время в секундах которое считается что крышка открывалась
const unsigned long time_open_box = (unsigned long)4 * 1000;
// Хранит количество открываний
byte num_open = 0;
// Флаг присвоеня количиства открытий
bool time_flag = true;

// Хранит количество нажатий на кнопку
byte click_but = 0;
// Статус кнопки
bool click_but_f = true;

// Хранит данные влажности датчика №1
byte h1;
// Хранит данные температуры датчика №1
float t1;
// Хранит данные влажности датчика №2
byte h2;
// Хранит данные температуры датчика №2
float t2;

// Определяем номер вывода к которому подключёна кнопка
#define pinBTN 2

// Определяем номер вывода к которому подключён фоторезистор
#define PIN_PHOTO_SENSOR A1


/**************************************************************************************/

void setup() {
  //Serial.begin(9600);

  // Инициируем работу с LCD дисплеем
  lcd.init();
  // Включаем подсветку LCD дисплея
  lcd.backlight();

  // Обнуляем точки отчёта
  time_sensor = time_screen = time_changer = millis();

  // Конфигурируем вывод к которому подключена кнопка
  pinMode(pinBTN, INPUT );


  // Получаем данные с датчиков и выводин данные на экран
  Sensor();
  Print_1();
}

/************************************************************************************/

void loop() {

  // Получаем данные с датчиков один раз в time_sensor_query миллисекунд
  if (millis() - time_sensor > time_sensor_query) {
    Sensor();
    // Обнуляем точкe отчёта
    time_sensor = millis();
  }

  /* Обработка подсветки экрана
   *********************************************************************************/
  // Выключение подсветки экрана
  if (millis() - time_screen > time_screen_query) {
    // Выключение подсветки дисплея
    lcd.noBacklight();

    // Сбрасываем счётчик кнопки
    click_but = 0;

    // Обнуляем точкe отчёта
    time_screen = millis();

    // Сбрасываем флаг нажатия кнопки
    click_but_f = true;
  }

  /* Обработка событий кнопки включения/переключения экрана
   *********************************************************************************/
  // Если кнопка нажата, то ...
  if (digitalRead(pinBTN)) {
    // Выполняем задержку на 1 мс для подавления дребезга при нажатии на кнопку
    delay(1);

    // Устанавливаем флаг нажатия кнопки
    click_but_f = false;

    // Обрабатываем количество нажатий на кнопку
    switch (click_but) {
      // Включаем подсветку экрана и обнуляем точку отсчёта и включаем первый экран
      case 0:
        lcd.backlight();
        time_screen = millis();
        // Обнуление данных при первом нажатии
        NullStateBut();
        // Включаем первый экран
        Print_1();
        break;
      // Экран данных с холодильника
      case 1:
        Print_2();
        break;
      // Экран с времени работы
      case 2:
        Print_3();
        break;
      // Экран с количеством открываний
      case 3:
        Print_4();
        break;
    }
    // Увеличиваем значение кнопки
    click_but++;
    if (click_but >= 4) {
      click_but = 0;
    }
    // Задержка нажатия
    delay(300);
  }

  /* Вывод данных на экран
   *********************************************************************************/
  // Проверяем флаг нажатия кнопки
  if (click_but_f) {
    // Первый экран: данные улицы
    if (millis() - time_changer > time_changer_query and screen1) {
      Print_1();
      screen1 = false;
    }
    // Второй экран: данные холодильника
    else if (millis() - time_changer > time_changer_query * 2 and screen2) {
      Print_2();
      screen2 = false;
    }
    // Третий экран: данные о времени работы холодильника
    else if (millis() - time_changer > time_changer_query * 3 and screen3) {
      Print_3();
      screen3 = false;
    }
    // Четвёртый экран: данные о количестве открываний холодильника
    else if (millis() - time_changer > time_changer_query * 4 and screen4) {
      Print_4();
      screen4 = false;
    }
    // Обнуление данных
    else if (!screen1 and !screen2 and !screen3 and !screen4) {
      NullStateBut();
    }
  }

  /* Считаем количество открытий холодильника
   *********************************************************************************/
  // Получаем данные с датчика освещённости
  int val_sensor = analogRead(PIN_PHOTO_SENSOR);
  // Если превышен порог освещённости
  if (val_sensor > 10) {
    // Если превышен порог открытия
    if (millis() - time_open > time_open_box and time_flag) {
      // Увеличиваем количество открытий
      num_open++;
      // сбрасываем флаг
      time_flag = false;
    }
  } else {
    // Сбрасываем точку отсчёта
    time_open = millis();
    // Устанавливаем флаг
    time_flag = true;
  }
}

/*************************************************************************************
   Пользовательские функции
 ************************************************************************************/

void NullStateBut() {
  time_changer = millis();
  screen1 = screen2 = screen3 = screen4 = true;
}

/**
   Загружаем набор символов в ОЗУ дисплея
*/
void Simbol(byte a1, byte a2, byte a3, byte a4, byte a5, byte a6, byte a7, byte a8) {
  lcd.createChar(1, symbol_arr[a1]);
  lcd.createChar(2, symbol_arr[a2]);
  lcd.createChar(3, symbol_arr[a3]);
  lcd.createChar(4, symbol_arr[a4]);
  lcd.createChar(5, symbol_arr[a5]);
  lcd.createChar(6, symbol_arr[a6]);
  lcd.createChar(7, symbol_arr[a7]);
  lcd.createChar(8, symbol_arr[a8]);
}

/**
   Получение данных с датчиков
*/
void Sensor() {
  // Обнуляем данные
  h1 = t1 = h2 = t2 = 0;

  // Получяем данные с датчика №1
  if (dht1.read() == DHT_OK) {
    h1 = dht1.hum;
    t1 = dht1.tem;
  }

  // Получяем данные с датчика №2
  if (dht2.read() == DHT_OK) {
    h2 = dht2.hum;
    t2 = dht2.tem;
  }
}

/**
   Выводин информация: данные с первого датчика (улица)
*/
void Print_1() {
  // Загружаем набор символов (*С, У, л, ц)
  Simbol(1, 2, 3, 4, 0, 0, 0, 0);
  // Очищаем экран
  lcd.clear();
  // Выводим данные температуры/влажности на улице
  lcd.print("\2\3u\4a:"); // Улица
  lcd.setCursor(0, 1);
  lcd.print("t=");
  lcd.print(t1, 1);
  lcd.print("\1 h=");
  lcd.print(h1);
  lcd.print("%");
}

/**
   Выводин информация: данные во свторого датчика (холодильник)
*/
void Print_2() {
  // Загружаем набор символов (*С, л)
  Simbol(1, 3, 5, 6, 7, 0, 0, 0);
  // Очищаем экран
  lcd.clear();
  // Выводим данные температуры/влажности в холодильнике
  lcd.print("Xo\2o\3u\2\4\5uk:"); // Холодильник
  lcd.setCursor(0, 1);
  lcd.print("t=");
  lcd.print(t1, 1);
  lcd.print("\1 h=");
  lcd.print(h1);
  lcd.print("%");
}

/**
   Выводин информация: Время работы холодильника
*/
void Print_3() {
  // Загружаем набор символов (м, я, б, т, ы, ч, и, н)
  Simbol(8, 9, 10, 11, 12, 13, 7, 14);
  // Очищаем экран
  lcd.clear();

  // Выводим данные о времени работы
  lcd.print("Bpe\1\2 pa\3o\4\5:");  // Время работы

  // Формируем строку времени
  String time_job = "";
  int time = millis() / 1000;

  // Показываем часы
  time_job += time / 60 / 60;
  time_job += " \6ac. ";

  // Показываем минуты
  time_job += (time / 60) % 60;
  time_job += " \1u\7.";

  lcd.setCursor(0, 1);
  lcd.print(time_job);
}

/**
   Выводин информация: количество открываний
*/
void Print_4() {
  // Загружаем набор символов (л, в, т, ы, й)
  Simbol(3, 14, 11, 12, 15, 0, 0, 0);
  // Очищаем экран
  lcd.clear();

  // Выводим данные о количестве открываний
  lcd.print("Ko\1-\2o o\3kp\4\3u\5:");  // Кол-во открытий:
  lcd.setCursor(1, 1);
  lcd.print(num_open);
}

 

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Теперь чуть подробнее.

1. Микроконтроллер.

Может я перемудрил, но хочется уже перейти на «чистые» микроконтроллеры. В начале я хотел всё «смастерить» на attiny13 (говорят что она на тратит амперы, а выдаёт их), но не зная чистый ассемблер я понял, что не смогу всунуть свой скетч. Поэтому atmega328P, дабы не думать о «месте под солнцем».

2. Экран.

В начале я взял маленький экранчик (якобы от Nokia). Но умаялся с русским и своими символами. Очень непонятное и мудрёное всё. (я знаю, что есть библиотеки с кириллицей). В конечном итоге что-то получилось, в чём-то разобрался… чуть ли не переписал все библиотеки, но понял, экран – МАЛЕНЬКИЙ ))))) Нифига не видно. ну и перешёл на стандартный 16x2. Был в наличие 20х4, но что-то большеват, да и кушает много ампериков. Экраны у меня с модулями для конвертации в I2C. Пока не отпаивал.. думаю есть ли смысл..

3. Датчики температуры/влажности

Взял DHT22 (уже готовые модули, дабы не громоздить обвязку). Полностью меня устраивают: температурный диапазон самое то, точность не так уж и сильно важно, влажность будет говорить о проблемах в холодильнике.

4. Фоторезистор

Привязал фоторезистор на 20кОм. Эмпирическим путём понял, что при этом можно получить больший контраст между светом и темнотой.. Ах да.. Как понять, что крышку открывали?  Перепробовал многие датчики. Понял что простой способ определить открытие/закрытие – это освещение.. При закрытой крышке – освещение = 0, при отрытой > 0. Даже в багажнике машины ночью должно быть больше…

Теперь кратко по скетчу. Хотя весь код постарался подробно прокомментировать.. но всё же

- использовал библиотеку для датчиков iarduino_DHT.h. Кушает на килобайт меньше(!) да и работать интуитивно понятнее.

- создал массив символов для экранчика.. У меня китайский, и буковки на нём японо-китайские

- далее куча всяких переменных и констант, многие из которых используются вместо delay()

по циклю:

- дёргаю датчики не каждый такт, а раз в минуту (всё настраивается). Думаю чаще и смысла нет.

- делаю подсветку экрана на 20 секунд, потом выключаю. У меня экранчик синий и без подсветки плохо всё видно, но видно.. Не удачно выбрал экран (((…

- делаю переключение экранов кнопкой. Их 4: температура/влажность на улице, температура/влажность в холодильнике, время работы, количество открытий

- как экранчик погаснет каждые 3 секунды (настраивается) идёт смена экрна.

- ну и считаю количество открытий ящика… Думаю что если открыть холодильник, достать продукты и закрыть холодильник нужно примерно 4 секунды. Если меньше – это что-то техническое )))

 

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Теперь о проблемах.

1. Питание. Отказался от блока зарядки.. Ну очень неудобно будет таскать крышку от холодильника чтобы зарядить её ))) Решил вынимать и заряжать аккумуляторы. Хотел обойтись одним аккумулятором на 3,7 вольта, но оказалось AMS1117 нужно купать 4,8 вольт ((( Теперь думаю что лучше. Нужен совет!!! Из расчёта, что реально холодильник может работать максимум 11-13 часов

2. Энергосбережение… Хотя я уже не вижу смысла контроллер погружать в даун, т.к. экран отключить (если я правильно понял) от питания нельзя, а он кушает прилично. Схема собранная на макетке + Arduino UNO при включенной подсветке при питании от кроны кушает примерно 70 мА. С отключенной подсветкой – 45 мА. Есть ли вообще смысл заморачиваться по поводу энергосбережения?? Ну если только для самообразования..

3. Зависание.

Немного пока не разобрался что делать при зависании. На сколько я понял, нужно использовать «собаку» и перегружать контроллер.. Но как грамотно сохранить количество открытий и время, пока не разобрался.. Нужно помощь?

4. Количество открытий..

Хоть я и сделал простой способ подсчёта, но что-то он мне не очень нравится.. При проведении тест в течении 3-х часов при освещении ящик якобы открылся и закрылся 9 раз. Можно ли это как-то усовершенствовать???

В общем, жду комментарии, замечания, критику. Принимаю конструктивные предложения.. Вздохи и ахи мало интересуют.

PS

Зачем мне это надо? Хочу! А что не купить готовое? У меня есть руки!

PSS

Когда всё соберу, то думаю всё сделать это как готовое изделие.. Продавать не собираюсь, а вот подарить легко. Думаю хороший подарок для автомобилистов ))) Да и любому кто захочет, подарю

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Кстати.. по ходу начал изучать СИ... И понял что Ардуино делает много "поблажек" в коде ))) И извините если код сформатирован не по СИшному... Я PHPшник )))

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

GoDr пишет:

Теперь о проблемах.

1. Питание. Отказался от блока зарядки.. Ну очень неудобно будет таскать крышку от холодильника чтобы зарядить её ))) Решил вынимать и заряжать аккумуляторы. Хотел обойтись одним аккумулятором на 3,7 вольта, но оказалось AMS1117 нужно купать 4,8 вольт ((( Теперь думаю что лучше. Нужен совет!!! Из расчёта, что реально холодильник может работать максимум 11-13 часов

Я бы поставил MT3608, выставил минимально комфортное напряжение для экрана и обошелся одним литиевым элементом. Если элемент без защитной платы, то предусмотреть контроль напряжения. 

P/S На контроль открытия, обычный механический концевик или геркон. Что-то замудрили с фоторезистором. ИМХО.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

bwn пишет:
P/S На контроль открытия, обычный механический концевик или геркон. Что-то замудрили с фоторезистором. ИМХО.
Ничего механического не хотел. А вот геркон - чёрт!!!! и что я сам не допёр.. Дружище, отличная мысль!!! (+1) Единственное неудобство - это направленность крышки будет нужно соблюдать ))) Я с этим фоторезистором два дня тестов убил :)

bwn пишет:
Я бы поставил MT3608, выставил минимально комфортное напряжение для экрана и обошелся одним литиевым элементом.
Была мысль, но возник вопрос.. Как будет быстрее разряжаться аккумулятор при повышении напряжения или при понижении? И что больше греется?

PS

AMS1117 отличная вещица, но вот недумал что на столько должно быть повышенное напряжение (((

 

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

Герконы, поставьте два последовательно, на противоположных сторонах и крути как хошь, или квадрат? МТ, греться не будет совсем. А повышенное напряжение на 1117, полностью преобразуется в тепло, угадайте от кого разрядится быстрее?
При отсутствии защиты на литии, обязательно мониторить нижнее напряжение, может высосать до смерти. Как вариант защиты - делать по схеме SEPIC и диодами на входе подобрать порог, чтобы при 3,0-3,1В на литии, МТ сама отключалась. ИМХО.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Помозговал, окончательно перейду на геркон скорее всего.. Хотя нужно провести несколько тестов. Это всё же не просто ящик, нужно ещё чтобы геркон срабатывал 100%. Погоняю, потестирую и тогда выложу обновлённый скетч и схему.

По защите от разряда была мысль.. но бумал примастить простой индикатор типа spbkbs-10. Вроде и кушает мало и всё наглядно.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Вопрос по геркону... А он имеет "дребезг"  как у кнопок?

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

Любые механические контакты его имеют. Поставьте delay(500) и забудьте о нем, в вашей задаче, абсолютно не критично.
Защита от разряда, она, защита от дурака, в том числе и от себя самого. 

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Если честно, хочется иметь грамотную защиту от дурака(!).. Я тоже постоянно жене говорю что в омывателе должна быть вода (жидкость) всегда.. Но она всегда приезжает без бензина, с пустым омывателем, с грязными номерами и зеркалами )))))

Так.. открытие/закрытие решено на все 100(!) Вот я... такая прекрасная кнопка и название ей ГЕРКОН... )))

Теперь по проекту... выкидываю из схемы свой стабилизатор и ставлю повышающий.. Хотя вопрос.. 18650 имеет максимум (технический) 3.7, минимум допустим 2.8. Как сильно может поменяться выходное повышающего? в принципе всей логике пофиг, а вот экрану критично... По тестам максимум подсветки экрану (на макетке 2,9-3,1 выдаёт) видно. Но я так понял UNO проседает офигеть как на макетке... чистая даёт 3,29 (от USB), когда всё включено 2,9 (максимум 3,0). Мне нужно стабильное напряжение на экране.. Ну ли придётся выводить регулировку наружу.. что очень не желательно.

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

Он стабилизатор, значит никак, сотые вольта не рассматриваем. Возможно, перед самым отключением по допустимому напряжению, что-то и прыгает, не проверял. 18650 до 4,2В свежезаряженная. Нижнего предела нет, будет отдавать, пока не сдохнет. Ваша задача ограничить низ на 2,9-3,1. В целом, когда остается 3,3В, заряда почти нет <5%.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

И, профи, посмотрите скетч! ну наверняка он не идеальный и что-то реально можно сделать проще... Как сказал один человек

sadman41 пишет:
Откройте для себя прерывания... сразу маму вспомните и всех родственников до седьмого колена, настолько всё станет непрямолинейно.
вот очень хотелось бы узнать как можно изменить код с учётом этого )))

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

bwn, что-то полистал Интернет.. много всего написано и много всё усложняет.. Как реально с минимум(!) затрат отключить батарейку при "минимуме живучести"???

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

По мне, как я и сказал, SEPIC и подгонка нижнего предела напряжения для MT3608 диодами. Все остальные не дают особого выигрыша по простоте. Самые распространенные, триггерные схемы, в которых напряжение мониторит либо компаратор, либо сам МК и делает самоотключение при снижении ниже порога, включение обратно кнопкой. Так я сделал вот здесь. Можно поручить это МК. Плюс, можно использовать кнопку для включения-отключения, минус (условный) - само не включится никак, но и от питания ничего не потребляет.
Но, стабилизатор вам ставить все равно, преобразование его в SEPIC представляет из себя добавление еще одной индуктивности и разделительного конденсатора (он и не дает течь прямому току после отключения преобразователя). Выключился преобразователь, выключилось все, поднялось напряжение, преобразователь включился. Какой-то колебательный процесс, на граничном напряжении, скорее всего будет иметь место. Решите сами, что допустимо для вас, а потом принимайте решение.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

bwn, большое спасибо.. буду думать. 

PS

такая простая заморочка, а столько "высоких технологий" )))))

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Отвлёкся на отпуск чуть-чуть ))) и вернулся к проекту..

Я тут почитал про герконы.. "говорят" что не самый надёжный вариант и "советуют" использовать всё же датчик Холла. Идея понравилась.. Суть геркона замкнута/разомкнута... У датчика Холла можно уже определять расстояние от магнита, что исключает всякие случайности и дребезги "кнопки". То есть можно определить (расчитать) расстояние и уже точно определить что крышка открыта/закрыта.

Ваше мнение?

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

Что пнем об сову, что совой об пень.))) ИМХО.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

GoDr пишет:

Отвлёкся на отпуск чуть-чуть ))) и вернулся к проекту..

Я тут почитал про герконы.. "говорят" что не самый надёжный вариант и "советуют" использовать всё же датчик Холла. Идея понравилась.. Суть геркона замкнута/разомкнута... У датчика Холла можно уже определять расстояние от магнита, что исключает всякие случайности и дребезги "кнопки". То есть можно определить (расчитать) расстояние и уже точно определить что крышка открыта/закрыта.

Ваше мнение?

Геркон не самое надёжное устройство, менял на вязальных машинках часто раз в три пять лет, то-есть несколько миллионов срабатываний

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

ua6em пишет:

то-есть несколько миллионов срабатываний

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

То ТС, ставьте, что больше по душе. В данном случае, разницы никакой.

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

Геркон не самое надёжное устройство...


Причём, наиболее частая неисправность - залипает. Щелбана дашь - работает дальше...) Но менять нужно. Зато альтернативы по экономичности нет.)

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

а почему бы не поставить экран oled0.96, он кушает вроде как меньше 1602

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Green пишет:

ua6em пишет:

Геркон не самое надёжное устройство...


Причём, наиболее частая неисправность - залипает. Щелбана дашь - работает дальше...) Но менять нужно. Зато альтернативы по экономичности нет.)


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

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Да понял я юмор про геркон и про сову, понял )))))))) Просто пока эксперементы делаю. С другой стороны, датчик хола это всё же не "кнопка", т.е. можно будет засчитывать открытие/закрытие крышки на уже определённом расстоянии и не считать когда крышку просто поправляешь..

Почему не использую oled0.96? Так уже писал... маленький, ничерта не видно, хоть и удобно (если не считать геморой со своими символами). В общем нужно всматриваться в экран. Хотя кушает он конечно меньше.. С другой стороны если очень грудо взять аккум в 2000мАч и нагрузку в 100мА то заряда должно хватить часов на 14, что за глаза должно хватить. Даже если поездка 18 часов, то уже холодильные аккумуляторы помрут и считать ничего не нужно )))
 
ЗЫ
наконец то пришли чистые ATMega`и... попробую собрать на макетке новый вариант схемы.  И посмотреть сколько будет кушать.. За одно проверю что лучше повышать напряжение или понижать ))))
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Не, ну конечно это не переключатель от объекта двигавшегося со скоростью близкой к 8 километрам в секунду  и ударившегося об землю и после этого пролжающего нормально работать )))
PS я о герконе

Green
Offline
Зарегистрирован: 01.10.2015

trembo][quote=Green пишет:
Не знаю, не знаю..... В лифтах десятками лет работают.

Ключевое слово "количество срабатываний". Да, работают по несколько лет, но за год случается до 8млн срабатываний.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Погонял, потестил и окончательно остановился на датчике Холла SS49E. Поясню почему... Герконы мне не понравились, по крайней в этом устройстве не самый удобный вариант. Кнопка она и есть кнопка. Нужно что-то придумывать и костылить от ложных срабатываний (типа поправили или приоткрыли крышку).

Датчики хола отлично в данном случае работаю - не будет срабатывания пока уже точно не будет открыта крышка, т.е. есть плавная реакция на расстояние.

Выбра именно 49Е так как в "спокойном" состоянии напряжение примерно 2,2-2,5 вольта. Как только подносишь магнит, то в зависимости от полюса, меняется или до 0,8 или до 4,8. Во-первых, не нужно задумываться о полярности магнита, просто добавил условие в скетч и всё. Во-вторых, "спокойное" состояние достигается на расстояние уже примерно 3см, что более чем достаточно. 

Green
Offline
Зарегистрирован: 01.10.2015

Да кто ж против! Если под ваши требования подходит - какие вопросы. Отсутствие дребезга - это не так важно, как экономичность и стоимость. Относительно герконов имеется ввиду.)

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Ну экономичности тут будет мало... Да и герконы дороже датчиков Холла (сейчас посмотрел у китайцев... сам удивился)

Green
Offline
Зарегистрирован: 01.10.2015

))Хе-хе. Считал что то что доступнее, то и дешевле.( Да, вопрос не однозначный.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вот я не пойму. А почему меню не организовать на конечном автомате. Ведь тогда и проще код отлаживать. Да рhp-кам так проще написать.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

Что-то не уловил.. что за меню?

Green
Offline
Зарегистрирован: 01.10.2015

- оффициант, блюдей мне...
- каких блюдей, может вам меню?
- можно и тебю!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Green] </p> <p>[quote=trembo пишет:
Green пишет:
Не знаю, не знаю..... В лифтах десятками лет работают.

Ключевое слово "количество срабатываний". Да, работают по несколько лет, но за год случается до 8млн срабатываний.


12 этажей, больница, 12 лифтов.
Лифтам от 30-ти до 2-ух лет.
С 8:00 до 17:00 носятся без остановки.
Пробег могу в статистике глянуть, там тысячи километров в год...
Магнит на каждом этаже.
На старых по 4 магнита.
Замедление снизу, точная остановка снизу, точная остановка сверху, замедление сверху.
Это на каждом этаже.
И 3-4 метра дистанции.
Контакторы, реле, концевики, кнопки ломались, но герконы - даже вспомнить не могу.

Green
Offline
Зарегистрирован: 01.10.2015

У каждого своя практика. Наверное, ещё и от типа геркона что-то зависит.