DIY. Спот(точечная сварка) из трансформатора и arduino pro mini (+код скетча)

Submitted by char0day on пн, 07/23/2018 - 12:11
Точечная сварка трансорматор+ардуино. Фото

Процесс сборки аппарата  описал в блоге на drive2

Ниже код скетча. Для регулировки длины импульса использовал энкодер. Осталось прикрутить дисплей, чтобы видеть значение импульса, а не считать в уме количество щелчков энкодера :).
Часть кода не моя, но я, к сожалению, не помню, откуда брал. Использован код (не мой) для программного устранения дребезга (функция debounce()). Также функция encoder() не моя. Эти функции, возможно, слегка переработаны относительно авторских вариантов.
Алгоритм следующий.
1. Короткое нажатие на кнопку вызывает импульс запрограммированной длины (arduino кратковременно включает реле на нужное количество миллисекунд). После этого в течение двух секунд повторный импульс невозможен.
2. Длинное нажатие (более 2х секунд)  вызывает долговременное включение реле (реле остается включенным до отпускания кнопки)

  1. /*
  2.   impulse with soft debounce
  3.   11/06/2018 Char0day  
  4. */
  5. // Константы
  6. const int ledPin =  LED_BUILTIN;// номер пина со светоиодом (встроенный)
  7. const int impulsePin=10;
  8. const int buttonPin=A3;    // пин А3 подключаем к кнопке без фиксации
  9. const int pin_DT = 7;      // пин 7 подключаем к DT енкодера
  10. const int pin_CLK = 8;     // пин 8 подключаем к CLK енкодера
  11.  
  12. // Переменные
  13.  int pos_encoder = 0; // Первоначальная позиция енкодера равна 0
  14.  int Last;            // Тут всегда будет лежать предыдущие значение положения енкодера 
  15.  int DT;
  16.  boolean left;
  17.  
  18. int impulse=100;                // длина импульса в миллисекундах 
  19.  
  20. int ledState = LOW;             // ledState используется для упрвления светодиодом. Когда нажата кнопка - светодиод горит
  21. bool longpressButton=false;     // Отслеживаем долгое нажатие кнопки
  22.  
  23. void setup() 
  24. {
  25.   pinMode (pin_DT,INPUT);
  26.   pinMode (pin_CLK,INPUT);
  27.   Last = digitalRead(pin_DT); // Считываем значение на выходе DT и запоминаем его
  28.   Serial.begin (9600);
  29.  
  30.   pinMode(ledPin, OUTPUT);
  31.   pinMode(impulsePin, OUTPUT);
  32.   pinMode(buttonPin, INPUT);
  33. }
  34.  
  35. bool debounce(int pin) 
  36. { 
  37.   bool current = digitalRead(pin); 
  38.   if (current != LOW) 
  39.   { // Старое значение отличается от полученного 
  40.     delay(10); // Ждем пока состояние стабилизируется - игнорируем дребезг 
  41.   }
  42.   current = digitalRead(pin); // Считываем стабилизированное значение 
  43.  return current; 
  44. }
  45.  
  46. int encoder()
  47. {
  48.      DT = digitalRead(pin_DT);
  49.    if (DT != Last)
  50.    { // Сравниваем фактическое положение с предыдущим, если они не равны то енкодер изменил положение
  51.  
  52.      if (digitalRead(pin_CLK) != DT) 
  53.      {  // Если значение с pin_CLK не равно значению с pin_DT, то значит вращение было НАПРАВО ->
  54.        pos_encoder++;
  55.        left = false;
  56.      } 
  57.      else 
  58.      { // Если значение с pin_CLK  равно значению с pin_DT, то значит вращение было НАЛЕВО <-
  59.        left = true;
  60.        pos_encoder--;
  61.      }
  62.      Serial.print ("Napravlenie vrashcheniya: ");
  63.      if (!left)
  64.      {  
  65.        Serial.println("NAPRAVO ->");  
  66.      }
  67.      else
  68.      {
  69.        Serial.println("NALEVO  <-");
  70.      }
  71.      Serial.print("Polozhenie: ");     
  72.      Serial.println(pos_encoder);
  73.  
  74.    } 
  75.    Last = DT;
  76.    if (pos_encoder >190) pos_encoder=185;
  77.    if (pos_encoder< -16) pos_encoder= -13;
  78.    return pos_encoder;
  79. }
  80.  
  81. void loop() 
  82. {
  83.   unsigned long currentMillis = millis();
  84.  
  85.      int imp=encoder();
  86.      bool pressButton = debounce(buttonPin);
  87.  
  88.      if (pressButton==false)  longpressButton=false;
  89.  
  90.      if (pressButton && longpressButton==false)
  91.      {
  92.         ledState = HIGH;
  93.         digitalWrite(ledPin, ledState);
  94.  
  95.         digitalWrite(impulsePin, HIGH);
  96.         delay (impulse+imp*5);
  97.         digitalWrite(impulsePin, LOW);
  98.  
  99.         ledState = LOW;
  100.         digitalWrite(ledPin, ledState);
  101.  
  102.         delay(2000);
  103.  
  104.         longpressButton=debounce(buttonPin);
  105.  
  106.         if (longpressButton)
  107.         {
  108.           ledState = HIGH;
  109.           digitalWrite(ledPin, ledState);
  110.  
  111.           digitalWrite(impulsePin, HIGH);
  112.         }        
  113.      }
  114.      else
  115.      {
  116.         if (pressButton==false && longpressButton==false)
  117.         {
  118.           ledState = LOW;
  119.           digitalWrite(ledPin, ledState);
  120.           digitalWrite(impulsePin, LOW);       
  121.         }
  122.      }
  123.  
  124. }

 

Оставить комментарий

Restricted HTML

  • Разрешённые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h4 id> <h5 id> <h6 id>
  • Строки и параграфы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.