Где взять 12 вольт для включения реле, если есть только 5 вольт для питания микроконтроллера.

В данном уроке мы рассмотрим не большую схему которая позволяет запитать реле на 12 вольт, если у Вас только 5 вольтовое питание. В данном случаи это лишь концепция которая может помочь Вам решить задачу для своего случая.
И так нам понадобиться схема DC/DC повышающего преобразователя. Другими словами нам надо с 5В получить 12В, для этого мы рассмотрим схему самого простого повышающего преобразователя: 
Вместо ключа мы с Вами поставим транзистор, импульсы управления на который будет подавать наш микроконтроллер, а та же с выхода преобразователя через делитель подадим обратную связь, что бы наш микроконтроллер знал что мы достигли заданного уровня напряжения на выходе.
И так наша схема будет выглядеть следующим образом:

Так как для нашего реле небольшие колебания напряжения не критичны, данная схема будет работать нормально, конечно, если Вам нужно запитать с 12В например операционный усилитель, такое решение Вам не подойдет.
Включать/выключать реле мы будем через кнопку которую подключим к свободной ножке микроконтроллера, при нажатии которой мы запустим наш преобразователь, и при достижении заданного уровня подадим сигнал на включения реле.

В данном примере у меня будет использоваться плата Arduino Nano:

Кнопка  — D7
ШИМ сигнал — D3
Включение реле — D4
Аналоговый вход — A4
Так как у нас можно на аналоговый вход подавать напряжение до 5 Вольт, сопротивление R3 заменил на 20В.
Таким образом соотношение идет 1 к 3, то есть для корректного отображения/расчета уровня напряжения коэффициент в программе нужно выбрать 15 (5*3).

Перейдем к программному коду, так как это у нас лишь концепция, то реализацию мы сделаем на Arduino Nano. 

#define knopka 7
#define PWR    3
#define OnRele 4
#define anlogV A4

 

bool cur=1; // кнопка не нажата
bool last = HIGH;
bool fstart=0;//флаг начала
int Q=0;
unsigned long t = 0;

 

float voltage=0;
int value=0;

 

void setup() {
   pinMode(knopka,INPUT_PULLUP);
   pinMode(OnRele,OUTPUT);
   pinMode(PWR, OUTPUT);     // D3 как выход (PWR)
   // Настраиваем Timer2 на частоту ~31.4 кГц
   TCCR2B = TCCR2B & 0b11111000 | 0x01;  // делитель 1

 

   pinMode(anlogV, INPUT);

 

   Serial.begin(115200);
}

 

void loop() {
  //читаем кнопку
  cur = digitalRead(knopka);
  if (cur != last) {               // изменение
    t = millis();                  // старт таймера дребезга
    last = cur;
  }
  if (millis() — t > 20) {         // 20 мс стабильно — считаем валидным
    if (cur == LOW) {              // кнопка нажата
     if(fstart==0){
        fstart=1;
      }
    }
  }
  if (millis() — t > 20) {         // 20 мс стабильно — считаем валидным
    if (cur == HIGH) {              // кнопка нажата
     if(fstart==1){
        fstart=0;
      }
    }
  }

 

 if(fstart==1){
  value=analogRead(A4);
  voltage = value * (15.0 / 1023.0); // Перевод в вольты
  if(voltage<12){
    Q=50;
    analogWrite(PWR, Q);
  }else{
   Q=0;
   analogWrite(PWR, Q);
  }
  if(voltage>12){
    digitalWrite(OnRele, HIGH);
  }
}else{
  Q=0;
  analogWrite(PWR, Q);
  digitalWrite(OnRele, LOW);
}

 

Serial.print(«But=»);Serial.print(fstart);
if(fstart==1){
 Serial.print(»  V=»);Serial.print(voltage);
}
Serial.print(»  PWR=»);Serial.println(Q);
}