ЭЛЕКТРОНИКА Спайщик прутка

Pr3D

✩✩✩✩✩✩✩
12 Апр 2023
9
0
Простейшая схема с нагревательным элементом и охладителем.
Мосфеты используются IRFZ44N, для их открытия нужно 5в..
На ПИНе Д2 все норм и обдув включается. На ПИНе Д3 только 0,5в.
Заменил 2 ардуинке, а проблема таже.

Схема.jpg

Отключал из цепи резисторы следующие за пином Д3 чтоб исключить кз и ошибку в маркировке резисторов.
У знакомого все получилось с первого раза. Пробовал его и свою прошивку - все тоже самое .

IMG_20240618_175532.jpg
IMG_20240618_180358.jpg
IMG_20240618_200803.jpg
IMG_20240619_124206.jpg

Может дело в шим сигнале или использовал не ту библиотеку!?

При компиляции IDE выдал только одну ошибку "отсутствие" библиотеки. Установил библиотеку как на скрине ниже
Screenshot_3.jpg




C++:
#include <EncButton.h>



#define switchPin 10 // Пин кнопки
#define mosfetPin 3 // Пин нагревателя. Обязательно должен быть с ШИМ
#define fanPin 2    // Пин вентилятора
#define redPin 8    // Пин красного светодиода
#define greenPin 6  // Пин зелёного светодиода
Button btn(switchPin);

enum
{
    waitMode,
    heatingMode,
    warmingMode,
    coolingMode
} workMode;


void setup()
{
    Serial.begin(115200);
    // pinMode(LED_BUILTIN, OUTPUT);
    // digitalWrite(LED_BUILTIN, LOW);
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(fanPin, OUTPUT);
    digitalWrite(greenPin, HIGH);
    pinMode(switchPin, INPUT_PULLUP);
    
 
 
    workMode = waitMode;
    switch2Wait();

}

bool fanOn = false;
unsigned long workTimer, blinkTimer;

#define heatingPeriod 20000    // Время разогрева
#define warmingPeriod 5000    // Время поддержания температуры
#define coolingPeriod 20000    // Время охлаждения
#define fanPeriod 30000       // Время работы вентилятора после охлаждения
#define warmingBlinkPeriod 200 // Период моргания красного светодиода
#define coolingBlinkPeriod 500 // Период моргания зелёного светодиода
#define warmValue 18          // Значение ШИМ при поддержании температуры
// int LED = 0;

void blinkLED(int blinkPin, int blinkPeriod)
{
    int static LED = 0;
    if (millis() - blinkTimer >= blinkPeriod)
    {
        LED = !LED;
        if (LED)
        {
            digitalWrite(blinkPin, HIGH);
        }
        else
        {
            digitalWrite(blinkPin, LOW);
        }
        blinkTimer = millis();
    }
}

void switch2Heating()
{
    Serial.println("Heating");
    workMode = heatingMode;
    workTimer = millis();
    digitalWrite(fanPin, LOW);
    analogWrite(mosfetPin, 36);
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin, HIGH);
  
  
}

void switch2Warming()
{
    Serial.println("Warming");
    workMode = warmingMode;
    digitalWrite(redPin, LOW);
    blinkTimer = millis();
    workTimer = millis();
}

void switch2Cooling()
{
    Serial.println("Cooling");
    workMode = coolingMode;
    analogWrite(mosfetPin, 0);
    digitalWrite(fanPin, HIGH);
    digitalWrite(redPin, LOW);
    blinkTimer = millis();
    workTimer = millis();
}

void switch2Wait()
{
    Serial.println("Wait");
    workMode = waitMode;
    analogWrite(mosfetPin, 0);
    digitalWrite(fanPin, HIGH);
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    workTimer = millis();
    fanOn = true;
}

void loop()
{




    btn.tick();
    if (btn.click())
    {
        if (workMode == waitMode)
        {
            switch2Heating();
        }
        else
        {
            switch2Wait();
        }
    }
    if (workMode == heatingMode)
    {
        // Serial.println(millis() - workTimer);
        if (millis() - workTimer >= heatingPeriod)
        {
            switch2Warming();
        }
    }
    if (workMode == warmingMode)
    {
        if (millis() - workTimer >= warmingPeriod)
        {
            switch2Cooling();
        }
        else
        {
            analogWrite(mosfetPin, warmValue);
            blinkLED(redPin, warmingBlinkPeriod);
        }
    }
    if (workMode == coolingMode)
    {
        if (millis() - workTimer >= coolingPeriod)
        {
            switch2Wait();
        }
        else
        {
            blinkLED(greenPin, coolingBlinkPeriod);
        }
    }
    if (workMode == waitMode)
    {
        if (fanOn && (millis() - workTimer >= fanPeriod))
        {
            fanOn = false;
            digitalWrite(fanPin, LOW);
            Serial.println("Fan off");
        }
    }

  

}
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
замените МОП на светодиод с резистором и добейтесь того что бы он плавно разгорался/тух, тогда можете считать ШИМ рабочим - подключаете транзистор.
 
  • Лойс +1
Реакции: Pr3D

Sergo_ST

★★★★★★✩
15 Мар 2020
954
824
@Pr3D, Как только инициализируете в setup() пин mosfetPin, шим сразу заработает.
C++:
pinMode(mosfetPin, OUTPUT);
 
  • Лойс +1
Реакции: Pr3D

Pr3D

✩✩✩✩✩✩✩
12 Апр 2023
9
0
@Sergo_ST,

Правильно ли понял:
нужно добавить строчку
pinMode(mosfetPin, OUTPUT);
вот сюда
C++:
void setup()
{
    Serial.begin(115200);
    // pinMode(LED_BUILTIN, OUTPUT);
    // digitalWrite(LED_BUILTIN, LOW);
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(fanPin, OUTPUT);
    digitalWrite(greenPin, HIGH);
    pinMode(switchPin, INPUT_PULLUP);
    
 
 
    workMode = waitMode;
    switch2Wait();

}
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
На ПИНе Д3 только 0,5в
так Вы никогда не включаете D3 в лог. 1, а ШИМ как раз может для мультиметра прикидываться пониженным напряжением.
Причину неработоспособности нужно искать. Можно воспользоваться советом
@vortigont, так поймёте, что ШИМ работает. Только светодиод подключайте через резистор. Если всё нормально - подключите светодиод вместо нагревательного элемента (только резистор возьмите побольше). Если там работать не будет - замените транзистор, у этого экземпляра порог включения слишком большой или ёмкость затвора мешает ему открываться.
Если работает и там, то просто не хватает мощности для разогрева нагревателя, можно увеличить duty в ШИМ.
 

Pr3D

✩✩✩✩✩✩✩
12 Апр 2023
9
0
@poty,
Интересно то что у других все работает!
попробую все выше перечисленное. Знакомым тоже стало интересно.
А может быть это из за неправильно используемой библиотеке?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
других все работает!
У других ваш мультиметр на этом коде показывает существенно другие значения?
Пока вы озвучили проблему, что измеряете 0.5 В.
Но в данном коде это и не удивительно т.к. в analogWrite вы выводите только небольшие значения.

Попробуйте в setup добавить код и сразу после reset померить мультиметром снова - должно быть около 5 вольт
analogWrite(mosfetPin, 254);
delay(5000); // Если допустимо включать нагрузку на 5 кекунд
analogWrite(mosfetPin, 0);
 
  • Лойс +1
Реакции: Pr3D

Pr3D

✩✩✩✩✩✩✩
12 Апр 2023
9
0
Решил Проблему!
заменил мосфет на пине д3 и все заработала. Может как мне повезло что 2 мосфете подряд не работало!
Всем спасибо за помощь,буду учитывать ваши замечания в следующих проектах.