ARDUINO Терморегулятор для вентилятора. Обсуждение проекта

Renemi

✩✩✩✩✩✩✩
19 Дек 2019
3
0
Доброго дня, возникла проблема с проектом терморегулятора (https://alexgyver.ru/thermocontrol/)
Проект собран на attiny85 c датчиком ds18B20, вентиляторы работают на минимальных оборотах, на изменение температуры не реагируют.
Так же имеется arduino pro mini, но не совсем понимаю как на ней данный проект собрать, т.к. на pro mini нет пина 5V как есть на нано.
444057_original.jpg
 
Последнее редактирование:

Эдуард Анисимов

★★★★✩✩✩
23 Сен 2019
904
265
54
Марий-Эл
Ребята. Если вы не умеете думать, не умеете читать схемы и даташиты, зачем вы в это лезете?
Прежде чем задавать такие вопросы полазьте по интернету. Почитайте.
Это всё равно что я сейчас приобрету термоядерный реактор и, вместо того что бы изучать его, я буду орать на весь свет "ребята а нахрена он мне нужен?"
 

Renemi

✩✩✩✩✩✩✩
19 Дек 2019
3
0
@Эдуард Анисимов, @PiratFox, Прошу прощения, я весьма неправильно сформулировал вопрос, то что на фото нано это я знаю, перефразирую. У меня имеется ардуино про мини, в проекте указана нано, и вся проблема уперлось в то что на про мини отсутствует тот самый вывод 5V, возможно он просто как то иначе помечен, к сожалению методом гугления информацию не нашел. Ну и по сути меня больше интересует почему всё отказывается работать на attiny85, учитывая что собрано всё по схеме, скетч грузится без ошибок, но изменения оборотов вентилятора при изменении температуры не происходит
Arduino-Pro-Mini-ATmega328.jpg
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
про мини есть версия на 16мгц и на 8
которая на 8 - работает от 3.3в на выводе vcc, но может запитываться 5-9в на выводе raw

которая на 16 работает от 5в на выводе vcc или 6-9 на выводе raw

чтобы узнать, какая у тебя версия - надо на вывод Raw продать 6-12в и на выводе vcc замерить напряжение
в зависимости от частоты - в иде ардуины надо выбрать нужную версию платы, иначе будут неправильные тайминги у цифрового термометра и будет показывать херню

распиновки тут https://learn.sparkfun.com/tutorials/using-the-arduino-pro-mini-33v/all
 
  • Лойс +1
Реакции: Renemi

Renemi

✩✩✩✩✩✩✩
19 Дек 2019
3
0

@kalobyte, это я знаю, у меня 16мгц версия миньки, вся проблема в том что я не могу разобраться как переложить схему проекта с нано на про мини, т.к. на про мини отсутствует вывод помеченный как 5V, в связи чем и возник вопрос, возможно ли собрать данный проект на про мини вместо нано. Ну и опять же изначально хотел разобраться почему проект не работает на attiny85.​
scheme7.jpg
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
до тех пор, пока ты будеш рисовать такие детские рисунки вместо схем, то и не сможеш _понимать_, а только повторять как обезьяна

я ж тебе написал русским языком, что 5в есть на плате с 16мгц кварцем, если на той плате установлен стабилизатор на 5, а не 3.3
если он на 3.3, то 5в ты все равно можеш подать на вывод raw, только я не знаю, будет ли термоментр работать от 3.3в
вроде как должен

почему проект не работает на attiny85
для этого надо установить ядро для серии тини, тогда будут в списке другие платы и поддержка других контроллеров и наверное даже в коде ничего не надо будет менять в плане пинов
 

Ktototam

✩✩✩✩✩✩✩
18 Апр 2020
1
0
Аналогичная проблема,Код не захотел работать на attiny85 не с термистором не с ds18B20 ,Причем что интересно при включении все работает,и тинька плавно убавляет скорость вентилятора до миниума , после этого работа только на миниуме.Сначала думал что тинька зависает, но нет сигнализация о перегреве срабатывает...на ардуинке все работает..
 

Alexxx

✩✩✩✩✩✩✩
10 Май 2020
6
0
Доброго дня, возникла проблема с проектом терморегулятора (https://alexgyver.ru/thermocontrol/)
Проект собран на attiny85 c датчиком ds18B20, вентиляторы работают на минимальных оборотах, на изменение температуры не реагируют.
Так же имеется arduino pro mini, но не совсем понимаю как на ней данный проект собрать, т.к. на pro mini нет пина 5V как есть на нано.
Посмотреть вложение 10266
у меня тоже attiny85 c датчиком ds18B20, вентиляторы работают на минимальных оборотах, на изменение температуры не реагируют,
светодиод на нажатие кнопки реагирует, пищалка тоже.

может кто подскажет...
 

PiratFox

★★★✩✩✩✩
13 Фев 2020
480
105
Харьков
Схему и скетч в Студию! А то это всё пустые слова. Мало ли чего вы, уважаемые, там с пинами наворочали. Хотите помощи - так подробно выкладывайте. За вас тут никто думать не будет. Знаете ли, штатные экстрасенсы у нас на карантине... На звонки не отвечают, гады...
 

Alexxx

✩✩✩✩✩✩✩
10 Май 2020
6
0
Схему и скетч в Студию! А то это всё пустые слова. Мало ли чего вы, уважаемые, там с пинами наворочали. Хотите помощи - так подробно выкладывайте. За вас тут никто думать не будет. Знаете ли, штатные экстрасенсы у нас на карантине... На звонки не отвечают, гады...
Только пищалку не подключал
scheme5.jpg

К стати при нажатии на кнопку индикатор тускнеет или загорается
hw-018.jpg
 

Вложения

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
код лучше вставлять в форум, а то лень эти архивы качать, потом вся папка хламом завалена
 

Alexxx

✩✩✩✩✩✩✩
10 Май 2020
6
0
терморегулятор:
/*
  Скетч к проекту "Терморегулятор"
  - Страница проекта (схемы, описания): https://alexgyver.ru/thermocontrol/
  - Исходники на GitHub:
  Проблемы с загрузкой? Читай гайд для новичков: https://alexgyver.ru/arduino-first/
  Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
  Автор: AlexGyver, AlexGyver Technologies, 2020
  https://www.youtube.com/c/alexgyvershow
  https://github.com/AlexGyver
  https://AlexGyver.ru/
  alex@alexgyver.ru
*/

// v1.1: улучшена стабильность

/*
  Терморегулятор с выходом ШИМ 20 кГц 0-100%
  Датчик температуры: термистор или DS18b20
  Управление кнопкой:
  - 1x клик: вкл/выкл вентиль
  - 2x клик: задать минимальную температуру
  - 3x клик: задать максимальную температуру
  - 4x клик - сброс на "стандартные" MIN_TEMP и MAX_TEMP
  Поддерживается ATmega328 (Arduino NANO) и ATtiny85 (Digispark)

  ШИМ пин:
  - D3 на Arduino (PD3 чип)
  - P1 на Digispark (PB1 чип)

  Пин термистора/далласа:
  - A0 на Arduino (PC0 чип)
  - A1 (P2) на Digispark (PB2 чип)

  Пин кнопки:
  - D2 на Arduino (PD2 чип)
  - P3 на Digispark (PB3 чип)

  Пин пищалки:
  - D4 на Arduino (PD2 чип)
  - P0 на Digispark (PB0 чип)
*/

// ========= ДАТЧИК ========
#define SENSOR_TYPE 1   // 0 - термистор, 1 - ds18b20

// для термистора!
#define T_RESIST 10000  // сопротивление термистора при 25 градусах
#define R_RESIST 10000  // сопротивление резистора
#define B_COEF 4300     // B коэффициент
// серый 4300
// проводной 3950

// ===== РЕЖИМ РАБОТЫ =====
#define MIN_TEMP 30     // мин. температура
#define MAX_TEMP 45     // макс. температура
#define MIN_SPEED 30    // (0-255) мин скорость
#define MAX_SPEED 255   // (0-255) макс скорость
#define ALARM_TEMP 50   // температура тревоги
#define BUZZER_TYPE 0   // тип пищалки: 0 пассивный, 1 активный

// ========= КНОПКА ========
#define BTN_CONTROL 1   // настройка кнопкой, 0 вкл, 1 выкл
// если выкл, режим работы будет такой, как задан выше
// если вкл, то настройки можно будет изменить кнопкой

// ========= СИГНАЛ ========

// ===== ДЛЯ РАЗРАБОТЧИКОВ =====
// отладка
#define DEBUG_ENABLE 0
#if (DEBUG_ENABLE == 1)
#define DEBUG(x) Serial.println(x)
#else
#define DEBUG(x)
#endif

// выбор пинов
#if defined([B]AVR_ATtiny85[/B])
#pragma message ("tiny85")
#define BTN_PIN PB3   // кнопка
#define SENS_PIN A1   // датчик
#define OUT_PIN PB1   // выход
#define BUZ_PIN PB0   // пищалка
#else
#define BTN_PIN 2     // кнопка
#define SENS_PIN A0   // датчик
#define OUT_PIN 3     // выход
#define BUZ_PIN 4     // пищалка
#endif

// либы
#include "timerMinim.h"
timerMinim fanTimer(60);
timerMinim sensorTimer(2000);

#if (SENSOR_TYPE == 0)
#include "thermistorMinim.h"
// (пин, R термистора, B термистора, базовая температура, R резистора)
thermistor therm(SENS_PIN, T_RESIST, B_COEF, 25, R_RESIST);

#elif (SENSOR_TYPE == 1)
#include <microDS18B20.h>;
MicroDS18B20 dallas(SENS_PIN);
#endif

#if (BTN_CONTROL == 1)
#include <avr/eeprom.h>
// макросы для епрома
#define EEPROM_UPD_INT(addr, val) eeprom_update_word((uint16_t*)(addr), (uint16_t)(val))
#define EEPROM_READ_INT(addr) eeprom_read_word((uint16_t*)(addr))

#include <GyverButton.h>
GButton btn(BTN_PIN);
#endif

// дата
int16_t minTemp = MIN_TEMP, maxTemp = MAX_TEMP;
bool systemState = true;
int newFanSpeed = 0;
int currentTemp = 0;
int fanSpeed = 0;
uint32_t thisTime;
bool buzFlag = false;
bool alarmFlag = false;

void setup() {
#if (DEBUG_ENABLE == 1)
  Serial.begin(9600);
#endif

  // пинаем далласа
#if (SENSOR_TYPE == 1)
  dallas.requestTemp();
#endif

  // восстанавливаем настройки (если с кнопкой)
#if (BTN_CONTROL == 1)
  if (eeprom_read_byte(0) != 50) { // первый запуск
    eeprom_write_byte(0, 50);
    EEPROM_UPD_INT(1, minTemp);
    EEPROM_UPD_INT(3, maxTemp);
  }
  minTemp = (int)EEPROM_READ_INT(1);
  maxTemp = (int)EEPROM_READ_INT(3);
#endif
  initPWM();
  pinMode(BUZ_PIN, OUTPUT);
  pinMode(OUT_PIN, OUTPUT);
}

void loop() {
  tempToSpeed();
  fanTick();
  buttonTick();
}

// преобразуем температуру в скорость
void tempToSpeed() {
  if (sensorTimer.isReady()) {
#if (SENSOR_TYPE == 0)
    currentTemp = therm.getTempAverage();
#elif (SENSOR_TYPE == 1)
    currentTemp = dallas.getTemp(); // получить с далласа
    dallas.requestTemp();           // запросить измерение
#endif
    // преобразовать диапазон и ограничить значение
    if (!systemState) newFanSpeed = 0;          // если выкл - скорость 0
    else {
      newFanSpeed = map(currentTemp, minTemp, maxTemp, MIN_SPEED, MAX_SPEED);
      newFanSpeed = constrain(newFanSpeed, MIN_SPEED, MAX_SPEED);
    }

    initPWM();    // заново инициализируем шим, тон его ломает
    if (currentTemp > ALARM_TEMP) {
      alarmFlag = !alarmFlag;
#if (BUZZER_TYPE == 0)
      if (alarmFlag) tone(BUZ_PIN, 400, 900);
#else
      digitalWrite(BUZ_PIN, alarmFlag);
#endif
    } else {
      digitalWrite(BUZ_PIN, 0);
    }
    //DEBUG(currentTemp);
  }
}

// плавный контроль вентилятора
void fanTick() {
  if (fanTimer.isReady()) {
    if (newFanSpeed > fanSpeed) fanSpeed += 2;  // плавно управляем
    if (newFanSpeed < fanSpeed) fanSpeed -= 2;  // плавно управляем
    fanSpeed = constrain(fanSpeed, 0, 255);  // ограничить
#if defined([B]AVR_ATtiny85[/B])
    tiny85_PWM20kHz(fanSpeed);    // ШИМ для тини
#else
    mega328_PWM20kHz_D3(fanSpeed);  // ШИМ для меги
#endif
    //DEBUG(fanSpeed);
  }
}

// отработка кнопки
void buttonTick() {
#if (BTN_CONTROL == 1)
  btn.tick();
  if (btn.hasClicks()) {
    switch (btn.getClicks()) {
      case 1:
        systemState = !systemState;
        buzzer(1);
        break;
      case 2:
        minTemp = currentTemp;
        EEPROM_UPD_INT(1, minTemp);
        buzzer(2);
        break;
      case 3:
        maxTemp = currentTemp;
        EEPROM_UPD_INT(3, maxTemp);
        buzzer(3);
        break;
      case 4:
        minTemp = MIN_TEMP;
        maxTemp = MAX_TEMP;
        EEPROM_UPD_INT(1, minTemp);
        EEPROM_UPD_INT(3, maxTemp);
        buzzer(4);
        break;
    }
  }
#endif
}

// пищатель
void buzzer(byte count) {
  for (byte i = 0; i < count; i++) {
#if (BUZZER_TYPE == 0)
    tone(BUZ_PIN, 400, 200);
    delay(200);
#else
    digitalWrite(BUZ_PIN, 1);
    delay(200);
    digitalWrite(BUZ_PIN, 0);
#endif
    delay(70);
  }
  initPWM();  // заново инициализируем шим, тон его ломает
}

void initPWM() {
#if defined([B]AVR_ATtiny85[/B])
  // инициализация ШИМ 20 кГц для tiny85
  TCCR0A = _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(WGM02) | 0x02;
  OCR0A = 99;
#else
  // инициализация ШИМ 20 кГц для mega328
  TCCR2A = 0b10100011;
  TCCR2B = 0b00001010;
  OCR2A = 99;
#endif
}

// ШИМ 20 кГц
#if defined([B]AVR_ATtiny85[/B])
void tiny85_PWM20kHz(uint8_t duty) {
  OCR0B = (float)duty * 0.39;
}
#else
void mega328_PWM20kHz_D3(uint8_t duty) {
  if (duty == 0) {
    bitClear(TCCR2A, COM2B1);
    bitClear(PORTD, 3);
  } else {
    bitSet(TCCR2A, COM2B1);
    OCR2B = map(duty, 0, 255, 0, 99);
  }
}
#endif
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
741
158
#if defined(AVR_ATtiny85)
ошибка тут, препроцессор не увидит тини85, надо убрать квадратные скобки
это форматирование сбилось в оригинале видать, поэтому выводы неправильно замапились
 

Alexxx

✩✩✩✩✩✩✩
10 Май 2020
6
0
#if defined(AVR_ATtiny85)
ошибка тут, препроцессор не увидит тини85, надо убрать квадратные скобки
это форматирование сбилось в оригинале видать, поэтому выводы неправильно замапились
Вот так в коде, нет квадратных скобок
1589463626068.png
 

Manife$t

✩✩✩✩✩✩✩
1 Июл 2020
1
0
Здравствуй форумчане. Такой вопрос. Как можно реализовать термо управление оборотами с одной ардуинки например но на четырех серверных вентиляторах независимо от друг друга? Вентиляторы типа AFC1512DG 12в 1,8А или подобные по мощностям.

Понадобилось для зонального охлаждения закрытого корпуса. Очень много рыл в гуглах ютюбе и форумах. Но ничего подобного не нашел. В общем прошу совета и помощи в реализации.

Хотя бы чисто теоретически.