Ребят помогите разобраться

roccomoco
Offline
Зарегистрирован: 30.10.2017

Всем доброго времени суток ! С Ардуино занялся сравнительно недавно . Хочу собрать контактную сварку,на просторах нета нашёл скетч но не совсем то что нужно точней не под моё железо . Не хватает управления 5ти реле для переключения тока,одна кнопка управляет 5тью реле по очерёдно.Плата UNO скетчи прилагаю. Заранее всем огромное спасибо!


const int buttonPin = 11;    // Кнопка спуска
const int ledPin = 12;       // Пин с сигнальным светодиодом
const int triggerPin = 10;   // MOSFET с реле
const int buzzerPin = 9;     // Пищалка
const int analogPin = A3;    // Переменный резистор 10К для выставления длины импульса

// Объявляем переменные:
int WeldingNow = LOW;
int buttonState;
int lastButtonState = LOW;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;    // минимальное время в мс, которое надо выждать до срабатывания. Сделано для предотвращения ложных срабатываний при дребезге контактов спусковой кнопки

int sensorValue = 0;        // считываем значение, выставленное на потенциометре в эту переменную...
int weldingTime = 0;        // ...и на его основе выставляем задержку

void setup() {
  pinMode(analogPin,  INPUT);
  pinMode(buttonPin,  INPUT);
  pinMode(ledPin,     OUTPUT);
  pinMode(triggerPin, OUTPUT);
  pinMode(buzzerPin,  OUTPUT);
  digitalWrite(ledPin,     LOW);
  digitalWrite(triggerPin, LOW);
  digitalWrite(buzzerPin,  LOW);

  Serial.begin(9600);
}

void loop() {

  sensorValue = analogRead(analogPin); // считываем значение, выставленное на потенциометре
  weldingTime = map(sensorValue, 0, 1023, 15, 255); // приводим его к миллисекундам в диапазоне от 15 до 255
  Serial.print("Analog pot reads = ");
  Serial.print(sensorValue);
  Serial.print("\t so we will weld for = ");
  Serial.print(weldingTime);
  Serial.println("ms. ");

  // Для предотврещения ложных срабатываний кнопки убеждаемся сначала, что она зажата минимум в течение 50мс, прежде чем начать сварку:
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        WeldingNow = !WeldingNow;
      }
    }
  }

  // Если команда получена, то начинаем:
  if (WeldingNow == HIGH) {

    Serial.println("== Welding starts now! ==");
    delay(1000);

    // Выдаём три коротких и один длинный писк в динамик:
    int cnt = 1;
    while (cnt <= 3) {
      playTone(1915, 150); // другие ноты на выбор: 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956
      delay(500);
      cnt++;
    }
    playTone(100,  50);
    delay(1);

    // И сразу после последнего писка приоткрываем MOSFET на нужное количество миллисекунд:
    digitalWrite(ledPin,     HIGH);
    digitalWrite(triggerPin, HIGH);
    delay(weldingTime);
    digitalWrite(triggerPin, LOW);
    digitalWrite(ledPin,     LOW);

    // И всё по-новой:
    WeldingNow = LOW;

  } else {
    digitalWrite(ledPin,     LOW);
    digitalWrite(triggerPin, LOW);
    digitalWrite(buzzerPin,  LOW);
  }

  lastButtonState = reading;
}

// В эту функцию вынесен код, обслуживающий пищалку:
void playTone(int tone, int duration) {
  digitalWrite(ledPin, HIGH);
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(buzzerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(buzzerPin, LOW);
    delayMicroseconds(tone);
  }
  digitalWrite(ledPin, LOW);
}

 

 

int Relay1 = 2; // Подключаем реле 1
int Relay2 = 3; // Подключаем реле 2
int Relay3 = 4; // Подключаем реле 3
int Relay4 = 5; // Подключаем реле 4
int Relay5 = 6; // Подключаем реле 5  
int ButPin = 7; // Подключаем кнопку 
int flag = 0; // флаг состояния
int regim = 0; // Переключалка

void setup()
{
pinMode(Relay1, OUTPUT); 
pinMode(Relay2, OUTPUT); 
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
pinMode(Relay5, OUTPUT);
}

void loop()
{
if(digitalRead(ButPin) == HIGH && flag == 0) 
{ 
regim ++;
flag = 1;

if(regim > 5) // Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 0;
}
}

if(digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 0: OFF
if(regim == 0)
{
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, LOW);
digitalWrite(Relay5, LOW);
}

// РЕЖИМ 1: R
if(regim == 1)
{
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, HIGH);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, LOW);
digitalWrite(Relay5, LOW);
}

// РЕЖИМ 2: G
if(regim == 2)
{
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, HIGH);
digitalWrite(Relay4, LOW);
digitalWrite(Relay5, LOW);
}

// РЕЖИМ 3: B
if(regim == 3)
{
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, HIGH);
digitalWrite(Relay5, LOW);
}

// РЕЖИМ 4: RG
if(regim == 4)
{
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, LOW);
digitalWrite(Relay5, HIGH);
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схема где?

roccomoco
Offline
Зарегистрирован: 30.10.2017

Конкретная схема отсутствует ,есть наброски примерные.

roccomoco
Offline
Зарегистрирован: 30.10.2017

По отдельности скетчи работают ! А вот обЪеденить не получается.

roccomoco
Offline
Зарегистрирован: 30.10.2017

Всё ещё находится на стадии сборки, на панели пару микриков и один потенциометр первый микрик выбор тока переключением реле а второй пуск трансформатора ну и потенциометр выставляет время прожарки!

sadman41
Offline
Зарегистрирован: 19.10.2016

roccomoco пишет:

По отдельности скетчи работают ! А вот обЪеденить не получается.

Как же вы их объединяли - покажите что ли... а то я представить не могу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Как раз в данной ситуации ничего ему не сделается.

Т.е. вы не допускаете, что человек может два лупа в скетч плюхнуть?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Т.е. вы не допускаете, что человек может два лупа в скетч плюхнуть?

Ответ бы в другую тему, сюда попал по чистой случаности (мышом не туда ткнул), потому я его и удалил.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

roccomoco пишет:

Конкретная схема отсутствует ,есть наброски примерные.

Ну, так она и работает у Вас примерно-набросочно. И будет так работать, пока Вы к проекту серьёзно не подойдёте.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пробуйте

#define buttonPin 11    // Кнопка спуска
#define ledPin 12       // Пин с сигнальным светодиодом
#define triggerPin 10   // MOSFET с реле
#define buzzerPin 9     // Пищалка
#define analogPin A3    // Переменный резистор 10К для выставления длины импульса
#define Relay1 2 // Подключаем реле 1
#define Relay2 3 // Подключаем реле 2
#define Relay3 4 // Подключаем реле 3
#define Relay4 5 // Подключаем реле 4
#define Relay5 6 // Подключаем реле 5  
#define ButPin 7 // Подключаем кнопку 
int flag = 0; // флаг состояния
int regim = 0; // Переключалка

// Объявляем переменные:
bool WeldingNow = LOW;//kn_start
bool buttonState;
bool lastButtonState = LOW;//fl_start
bool f_knStart;

uint32_t lastDebounceTime;
//unsigned long debounceDelay = 50;    // минимальное время в мс, которое надо выждать до срабатывания. Сделано для предотвращения ложных срабатываний при дребезге контактов спусковой кнопки

int sensorValue = 0;        // считываем значение, выставленное на потенциометре в эту переменную...
int weldingTime = 0;        // ...и на его основе выставляем задержку
void setup(){
  pinMode(analogPin, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(triggerPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(Relay1, OUTPUT); 
  pinMode(Relay2, OUTPUT); 
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  pinMode(Relay5, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(triggerPin, LOW);
  digitalWrite(buzzerPin, LOW);

  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogPin); // считываем значение, выставленное на потенциометре
  weldingTime = map(sensorValue, 0, 1023, 15, 255); // приводим его к миллисекундам в диапазоне от 15 до 255

    if(digitalRead(ButPin) == HIGH && flag == 0) 
  { 
    ++regim ;
    flag = 1;

    if(regim > 4) // Если номер режима превышает требуемого
    { // то отсчет начинается с нуля
      regim = 0;
    }
    nagruzka(); 
  }

  if(digitalRead(ButPin) == LOW && flag == 1)
  {
    flag = 0;
    //Выводим в сериал присмене режима (чтобы не мелькало) 
    Serial.print("Analog pot reads = ");
    Serial.print(sensorValue);
    Serial.print("\t so we will weld for = ");
    Serial.print(weldingTime);
    Serial.println("ms. ");    
  }

  // Для предотврещения ложных срабатываний кнопки убеждаемся сначала, что она зажата минимум в течение 50мс, прежде чем начать сварку:
  //int reading = digitalRead(buttonPin);
  if (digitalRead(buttonPin)!= lastButtonState) {
    lastDebounceTime = millis();
    lastButtonState = !lastButtonState;
  }
  if(WeldingNow != digitalRead(buttonPin) && millis() - lastDebounceTime > 20){
    WeldingNow = digitalRead(buttonPin);
  }

  // Если команда получена, то начинаем:
  if (WeldingNow == HIGH && !f_knStart) {
    f_knStart = 1;
    Serial.println("== Welding starts now! ==");
    delay(1000);
    // Выдаём три коротких и один длинный писк в динамик:
    int cnt = 1;
    while (cnt <= 3) {
      playTone(1915, 150); // другие ноты на выбор: 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956
      delay(500);
      cnt++;
    }
    playTone(100,  50);
    delay(1);
    // И сразу после последнего писка приоткрываем MOSFET на нужное количество миллисекунд:
    digitalWrite(ledPin,     HIGH);
    digitalWrite(triggerPin, HIGH);
    delay(weldingTime);
    digitalWrite(triggerPin, LOW);
    digitalWrite(ledPin,     LOW);
    // И всё по-новой:
  }
  else if(!WeldingNow && f_knStart) {
    digitalWrite(ledPin,     LOW);
    digitalWrite(triggerPin, LOW);
    digitalWrite(buzzerPin,  LOW);
    f_knStart = 0;
  }
}

void nagruzka(){
  Serial.print("regim = ");
  Serial.println(regim);
  switch (regim) {
  case 0:
    digitalWrite(Relay1, HIGH);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 1:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, HIGH);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 2:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, HIGH);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 3:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, HIGH);
    digitalWrite(Relay5, LOW);
    break;
  case 4:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, HIGH);
    break;
  }
}
// В эту функцию вынесен код, обслуживающий пищалку:
void playTone(int tone, int duration) {
  digitalWrite(ledPin, HIGH);
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(buzzerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(buzzerPin, LOW);
    delayMicroseconds(tone);
  }
  digitalWrite(ledPin, LOW);
}


 

roccomoco
Offline
Зарегистрирован: 30.10.2017

Огромное спасибо vosara ! Всё отрабатывает ка часики!

Есть ещё такая не большая задачка, Serial.println  кроме этого ничего больше не выводит     "== Welding starts now! ==" а так как сварочка без дисплея хотелось бы время в микросеках видеть в мониторе сом порта  если не затруднит и возможно ли это сделать? Заранее огромное спасибо!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Можно

#define buttonPin 11    // Кнопка спуска
#define ledPin 12       // Пин с сигнальным светодиодом
#define triggerPin 10   // MOSFET с реле
#define buzzerPin 9     // Пищалка
#define analogPin A3    // Переменный резистор 10К для выставления длины импульса
#define Relay1 2 // Подключаем реле 1
#define Relay2 3 // Подключаем реле 2
#define Relay3 4 // Подключаем реле 3
#define Relay4 5 // Подключаем реле 4
#define Relay5 6 // Подключаем реле 5  
#define ButPin 7 // Подключаем кнопку 
int flag = 0; // флаг состояния
int regim = 0; // Переключалка

// Объявляем переменные:
bool WeldingNow = LOW;//kn_start
bool buttonState;
bool lastButtonState = LOW;//fl_start
bool f_knStart;

uint32_t lastDebounceTime;
//unsigned long debounceDelay = 50;    // минимальное время в мс, которое надо выждать до срабатывания. Сделано для предотвращения ложных срабатываний при дребезге контактов спусковой кнопки

int sensorValue = 0;        // считываем значение, выставленное на потенциометре в эту переменную...
int weldingTime = 0;        // ...и на его основе выставляем задержку
int temp_weldingTime;

void setup(){
  pinMode(analogPin, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(triggerPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(Relay1, OUTPUT); 
  pinMode(Relay2, OUTPUT); 
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  pinMode(Relay5, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(triggerPin, LOW);
  digitalWrite(buzzerPin, LOW);

  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogPin); // считываем значение, выставленное на потенциометре
  weldingTime = map(sensorValue, 0, 1023, 15, 255); // приводим его к миллисекундам в диапазоне от 15 до 255
if(weldingTime != temp_weldingTime){
//Выводим в сериал присмене режима (чтобы не мелькало) 
    Serial.print("Analog pot reads = ");
    Serial.print(sensorValue);
    Serial.print("\t so we will weld for = ");
    Serial.print(weldingTime);
    Serial.println("ms. "); 
    temp_weldingTime = weldingTime;
}

    if(digitalRead(ButPin) == HIGH && flag == 0) 
  { 
    ++regim ;
    flag = 1;

    if(regim > 4) // Если номер режима превышает требуемого
    { // то отсчет начинается с нуля
      regim = 0;
    }
    nagruzka(); 
  }

  if(digitalRead(ButPin) == LOW && flag == 1)
  {
    flag = 0;
       
  }

  // Для предотврещения ложных срабатываний кнопки убеждаемся сначала, что она зажата минимум в течение 50мс, прежде чем начать сварку:
  //int reading = digitalRead(buttonPin);
  if (digitalRead(buttonPin)!= lastButtonState) {
    lastDebounceTime = millis();
    lastButtonState = !lastButtonState;
  }
  if(WeldingNow != digitalRead(buttonPin) && millis() - lastDebounceTime > 20){
    WeldingNow = digitalRead(buttonPin);
  }

  // Если команда получена, то начинаем:
  if (WeldingNow == HIGH && !f_knStart) {
    f_knStart = 1;
    Serial.println("== Welding starts now! ==");
    delay(1000);
    // Выдаём три коротких и один длинный писк в динамик:
    int cnt = 1;
    while (cnt <= 3) {
      playTone(1915, 150); // другие ноты на выбор: 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956
      delay(500);
      cnt++;
    }
    playTone(100,  50);
    delay(1);
    // И сразу после последнего писка приоткрываем MOSFET на нужное количество миллисекунд:
    digitalWrite(ledPin,     HIGH);
    digitalWrite(triggerPin, HIGH);
    delay(weldingTime);
    digitalWrite(triggerPin, LOW);
    digitalWrite(ledPin,     LOW);
    // И всё по-новой:
  }
  else if(!WeldingNow && f_knStart) {
    digitalWrite(ledPin,     LOW);
    digitalWrite(triggerPin, LOW);
    digitalWrite(buzzerPin,  LOW);
    f_knStart = 0;
  }
}

void nagruzka(){
  Serial.print("regim = ");
  Serial.println(regim);
  switch (regim) {
  case 0:
    digitalWrite(Relay1, HIGH);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 1:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, HIGH);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 2:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, HIGH);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, LOW);
    break;
  case 3:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, HIGH);
    digitalWrite(Relay5, LOW);
    break;
  case 4:
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    digitalWrite(Relay5, HIGH);
    break;
  }
}
// В эту функцию вынесен код, обслуживающий пищалку:
void playTone(int tone, int duration) {
  digitalWrite(ledPin, HIGH);
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(buzzerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(buzzerPin, LOW);
    delayMicroseconds(tone);
  }
  digitalWrite(ledPin, LOW);
}