нужна помощь в правке скетча

временный
Offline
Зарегистрирован: 19.09.2014

Добрый день .

Нужна помощь вправке или переписи скетча. Данный скетч нужен для управления нагрузками (их три пока) во время работы  эл. станции + управление сервой (связан с рубильником) переключает нагрузку на городскую или резервную линию.

Сам уже два месяца топчусь на месте.

Проблема: в моём коде не выходит сразу из цикла переключения нагрузок

PS

На время симулирования время сократил до 18сек.

#include <Servo.h>


Servo myservo1;      //сервопривод рубильника

#define ledPin1 7        // это выход - светодиод вкл город
#define ledPin2 8        // это выход - светодиод вкл дэс
#define ledPin3 13       // это выход - светодиод ошибка недовключение
#define ledPin4 17;      // это выход - светодиод вкл бассейн
#define buttonPin1 12    //  это вход - кнопка 1 город
#define buttonPin2 14    //  это вход - кнопка 1 дэс
#define buttonPin3 4     //  это вход - концевик 1 город
#define buttonPin4 2     //  это вход - концевик 1 дэс
//#define buttonPin5 17   //  это вход - вход бассейна
//#define buttonPin6 18    //  это вход - вход дом
//#define buttonPin7 0     //  это вход - вход теплицы
//#define buttonPin8 15    //  это вход - тумблер
//#define buttonPin9 16    //  это вход - тумблер
#define relPin3 9        //ПУСКАТЕЛЬ бас
#define relPin4 10       //пускатель дом
#define relPin5 11       //пускатель теплица
int lednumber=4;       //количество светодиодов
int i;               //переменные циклов
int del=18000; 

void setup()
{
  myservo1.attach(3); // это серва связана с рубильником
}
  
void loop()

{
       myservo1.attach(3);
       digitalWrite(ledPin1, LOW);
       digitalWrite(ledPin2, LOW);
       digitalWrite(ledPin3, LOW);
       digitalWrite(relPin3, HIGH);
       digitalWrite(relPin4, HIGH);
       digitalWrite(relPin5, HIGH);
       
 {
  
     if((digitalRead(buttonPin1) == HIGH  && digitalRead(buttonPin2) == HIGH)||(digitalRead(buttonPin1) == LOW  && digitalRead(buttonPin2) == LOW))//проверяем наличие сигнала с города и дэс если сигнал есть и там и там тj
                                                                                                                                                   //проверяем наличие сигнала с города и дэс если нет сигнала и там и там то                     
      myservo1.write(85); // рубильник переводим в позицию 0        
     
      else                //если условие невыполняется то
  {       
      if(digitalRead(buttonPin1) == HIGH) //если есть сигнал город то рубильник переводится в положение город
     
      {
       myservo1.write(137);
       digitalWrite(ledPin1, HIGH);    //зажигаем сетодиод город
       digitalWrite(relPin3, LOW);     //
       digitalWrite(relPin4, LOW);
       digitalWrite(relPin5, LOW);
       myservo1.write(140);
       }
      if(digitalRead(buttonPin2)==HIGH)//если есть сигнал дэс то рубильник переводится в положение дэс
    
       {
       myservo1.write(35);
       digitalWrite(ledPin2, HIGH);    //зажигаем светодиод дэс
       myservo1.write(30);
       }
  }
     if((digitalRead(buttonPin1) == HIGH  && digitalRead(buttonPin3) == HIGH)||(digitalRead(buttonPin2) == HIGH  && digitalRead(buttonPin4) == HIGH))//если есть сигнал город и концевик город(тоесть рубильник установился в нужное положенние)
                                                                                                                                                     //или есть сигнал дэс и концевик дэс(тоесть рубильник установился в нужное положенние)        
      {                                                                                                                                      
      myservo1.detach();       //после установки сервы её отключить
      delay(500);
      }

  { 
   if (digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin4) == HIGH) //если есть сигнал дэс и концевик дэс (то следует запустить цикличное переключение нагрузки)
   

     for (i=9;i<=11;i++)                //выполняется цикл переключения реле от вывода 9 до 11 по 30мин
     {
     digitalWrite(i,LOW);//включили реле      
  delay(del);    //подождали      
  digitalWrite(i,HIGH); //выключили релe
    if (digitalRead(buttonPin2) == LOW || digitalRead(buttonPin4) == LOW)
     break;}
     
     }
   }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем рубильник? не лучше ли контактор (мощное рэле) поставить

можно и авр собрать

временный
Offline
Зарегистрирован: 19.09.2014

В дизель станции есть свой полнофункциональный АВР, контакторы стоят (только электросети прикололись, затребовали установку перекидного рубильника).

И нагрузки раза в три больше чем мощности электростанции.Поэтому гимр с переключением нагрузки. 

временный
Offline
Зарегистрирован: 19.09.2014

Рубильник с сервоприводом и концевиками уже скрестил прикольно получилось.

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

delay(del);    //подождали     

82 строка. не удивительно что не выходит :). это команда блокирующая. 

надо делать 

  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   
    <действия, которые необходимо отсрочить>
  }

Напишите на почту, возможно смогу помочь за небольшое вознаграждение... 

временный
Offline
Зарегистрирован: 19.09.2014
JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Вы про break в if? i=12; вместо break.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хз че я тут наредактировал

#include <Servo.h>
Servo myservo1;      //сервопривод рубильника

#define ledPin1 7        // это выход - светодиод вкл город
#define ledPin2 8        // это выход - светодиод вкл дэс
#define ledPin3 13       // это выход - светодиод ошибка недовключение
#define ledPin4 17;      // это выход - светодиод вкл бассейн
#define buttonPin1 12    //  это вход - кнопка 1 город
#define buttonPin2 14    //  это вход - кнопка 1 дэс
#define buttonPin3 4     //  это вход - концевик 1 город
#define buttonPin4 2     //  это вход - концевик 1 дэс
//#define buttonPin5 17   //  это вход - вход бассейна
//#define buttonPin6 18    //  это вход - вход дом
//#define buttonPin7 0     //  это вход - вход теплицы
//#define buttonPin8 15    //  это вход - тумблер
//#define buttonPin9 16    //  это вход - тумблер
#define relPin3 9        //ПУСКАТЕЛЬ бас
#define relPin4 10       //пускатель дом
#define relPin5 11       //пускатель теплица
int lednumber=4;       //количество светодиодов
int i;               //переменные циклов
int del=18000; 

void setup()
{
  myservo1.attach(3); // это серва связана с рубильником
}

void loop(){
  myservo1.attach(3);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(relPin3, HIGH);
  digitalWrite(relPin4, HIGH);
  digitalWrite(relPin5, HIGH);

  if((!digitalRead(buttonPin1) && !digitalRead(buttonPin2)) || (!digitalRead(buttonPin1) && !digitalRead(buttonPin2)))//проверяем наличие сигнала с города и дэс если сигнал есть и там и там тj
    //проверяем наличие сигнала с города и дэс если нет сигнала и там и там то                     
    myservo1.write(85); // рубильник переводим в позицию 0        

  else{                //если условие невыполняется то
    if(digitalRead(buttonPin1)){ //если есть сигнал город то рубильник переводится в положение город
      myservo1.write(137);
      digitalWrite(ledPin1, HIGH);    //зажигаем сетодиод город
      digitalWrite(relPin3, LOW);     //
      digitalWrite(relPin4, LOW);
      digitalWrite(relPin5, LOW);
      myservo1.write(140);
    }
    if(digitalRead(buttonPin2)){//если есть сигнал дэс то рубильник переводится в положение дэс
      myservo1.write(35);
      digitalWrite(ledPin2, HIGH);    //зажигаем светодиод дэс
      myservo1.write(30);
    }
  }
  if((digitalRead(buttonPin1)  && digitalRead(buttonPin3))||(digitalRead(buttonPin2) && digitalRead(buttonPin4))){//если есть сигнал город и концевик город(тоесть рубильник установился в нужное положенние)
    //или есть сигнал дэс и концевик дэс(тоесть рубильник установился в нужное положенние)        
    myservo1.detach();       //после установки сервы её отключить
    delay(500);
  }

  { 
    if (digitalRead(buttonPin2) && digitalRead(buttonPin4)) //если есть сигнал дэс и концевик дэс (то следует запустить цикличное переключение нагрузки)
      for (i=9;i<=11;i++){                //выполняется цикл переключения реле от вывода 9 до 11 по 30мин
        digitalWrite(i,LOW);//включили реле      
        delay(del);    //подождали      
        digitalWrite(i,HIGH); //выключили релe
        if (digitalRead(buttonPin2) == LOW || digitalRead(buttonPin4) == LOW)
          break;
      }
  }
}

 

временный
Offline
Зарегистрирован: 19.09.2014

Спасибо всем, roman2712 помог уже

Gruf
Offline
Зарегистрирован: 06.03.2019
Доброе утро! 
Данный скетч управляет двумя нагрузками по таймеру в режиме цикличности!
Проблема в том, что когда нажимаешь старт программа запускается, но при нажатии на стоп не реагирует на команду
Что не так?
 
[code]


#include <Switch.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h> // подключаем библиотеку EEPROM


LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

const byte buttonLEFTpin = A2; // (left button)
const byte buttonRIGHTpin = A3; // (rightt button)
const byte buttonSTARTpin = A1; // (start button)
const byte buttonSTOPpin = A0; // (start button)
const int outPin =  10; // heating controll
const int outPin2 =  11; // magnet controll
int smallNum;
int t;
int s;
int min;
int max;
bool ls = false;
bool rs = false;
bool buttonSTOPpushed = false;
Switch buttonLEFT = Switch(buttonLEFTpin); // button to GND, use internal 20K pullup resistor
Switch buttonRIGHT = Switch(buttonRIGHTpin); // button to GND, use internal 20K pullup resistor
Switch buttonSTART = Switch(buttonSTARTpin); // button to GND, use internal 20K pullup resistor
Switch buttonSTOP = Switch(buttonSTOPpin); // button to GND, use internal 20K pullup resistor


//Switch toggleSwitch = Switch(toggleSwitchpin);
//Switch buttonVCC = Switch(ButtonVCCpin, INPUT, HIGH); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
//Switch button10ms = Switch(Button10mspin, INPUT_PULLUP, LOW, 1); // debounceTime 1ms

void setup()
{
 lcd.init();                      // initialize the lcd 
 lcd.backlight();
  
pinMode(outPin, OUTPUT); // initialize the OUTPUT pin as an output:
digitalWrite(outPin, LOW);

s = 50;
min = 1000;
max = 12750;
smallNum = EEPROM.read(0); t =  smallNum * 50;
}

void loop()
{
 buttonLEFT.poll();
 buttonRIGHT.poll();
 buttonSTART.poll();
 buttonSTOP.poll();

 if(buttonLEFT.pushed())  {    t = t - s;   if(t <= min) t = min;   } 
 if(buttonLEFT.longPress()) ls = true;
 if(buttonLEFT.released())  ls = false;

 if(buttonRIGHT.pushed())  {    t = t + s;   if(t >= max) t = max;  } 
 if(buttonRIGHT.longPress()) rs = true;
 if(buttonRIGHT.released())  rs = false;
  
  if(ls == true) {t = t - s;  if(t <= min) t = min;   delay(20);lcd.setCursor(9,0); lcd.print("     ");} 
  if(rs == true) {t = t + s;  if(t >= max) t = max;   delay(20);lcd.setCursor(9,0); lcd.print("     ");} 


lcd.setCursor(0,0); lcd.print("Time"); lcd.setCursor(9,0); lcd.print(t);lcd.setCursor(14,0); lcd.print("ms"); EEPROM.write(0, t/50);

 if(buttonSTART.pushed()) {

  do
{
  if(buttonSTOP.pushed() or buttonSTOP.longPress()) buttonSTOPpushed = true;
  lcd.setCursor(4,1); lcd.print("Induction");  digitalWrite(outPin, HIGH);delay(t);digitalWrite(outPin, LOW); lcd.clear(); lcd.print("Extraction"); digitalWrite(outPin2, HIGH);delay(600);digitalWrite(outPin2, LOW);lcd.clear();delay(4000);
  if(buttonSTOP.pushed() or buttonSTOP.longPress()) buttonSTOPpushed = true;
  } while (buttonSTOPpushed == false);
  buttonSTOPpushed = false;
  }
  
}




[/code]

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

для начала код по правилам вставьте

Gruf
Offline
Зарегистрирован: 06.03.2019

Еслиб я знал как!

Gruf
Offline
Зарегистрирован: 06.03.2019
[code]


#include <Switch.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h> // подключаем библиотеку EEPROM


LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

const byte buttonLEFTpin = A2; // (left button)
const byte buttonRIGHTpin = A3; // (rightt button)
const byte buttonSTARTpin = A1; // (start button)
const byte buttonSTOPpin = A0; // (start button)
const int outPin =  10; // heating controll
const int outPin2 =  11; // magnet controll
int smallNum;
int t;
int s;
int min;
int max;
bool ls = false;
bool rs = false;
bool buttonSTOPpushed = false;
Switch buttonLEFT = Switch(buttonLEFTpin); // button to GND, use internal 20K pullup resistor
Switch buttonRIGHT = Switch(buttonRIGHTpin); // button to GND, use internal 20K pullup resistor
Switch buttonSTART = Switch(buttonSTARTpin); // button to GND, use internal 20K pullup resistor
Switch buttonSTOP = Switch(buttonSTOPpin); // button to GND, use internal 20K pullup resistor


//Switch toggleSwitch = Switch(toggleSwitchpin);
//Switch buttonVCC = Switch(ButtonVCCpin, INPUT, HIGH); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity
//Switch button10ms = Switch(Button10mspin, INPUT_PULLUP, LOW, 1); // debounceTime 1ms

void setup()
{
 lcd.init();                      // initialize the lcd 
 lcd.backlight();
  
pinMode(outPin, OUTPUT); // initialize the OUTPUT pin as an output:
digitalWrite(outPin, LOW);

s = 50;
min = 1000;
max = 12750;
smallNum = EEPROM.read(0); t =  smallNum * 50;
}

void loop()
{
 buttonLEFT.poll();
 buttonRIGHT.poll();
 buttonSTART.poll();
 buttonSTOP.poll();

 if(buttonLEFT.pushed())  {    t = t - s;   if(t <= min) t = min;   } 
 if(buttonLEFT.longPress()) ls = true;
 if(buttonLEFT.released())  ls = false;

 if(buttonRIGHT.pushed())  {    t = t + s;   if(t >= max) t = max;  } 
 if(buttonRIGHT.longPress()) rs = true;
 if(buttonRIGHT.released())  rs = false;
  
  if(ls == true) {t = t - s;  if(t <= min) t = min;   delay(20);lcd.setCursor(9,0); lcd.print("     ");} 
  if(rs == true) {t = t + s;  if(t >= max) t = max;   delay(20);lcd.setCursor(9,0); lcd.print("     ");} 


lcd.setCursor(0,0); lcd.print("Time"); lcd.setCursor(9,0); lcd.print(t);lcd.setCursor(14,0); lcd.print("ms"); EEPROM.write(0, t/50);

 if(buttonSTART.pushed()) {

  do
{
  if(buttonSTOP.pushed() or buttonSTOP.longPress()) buttonSTOPpushed = true;
  lcd.setCursor(4,1); lcd.print("Induction");  digitalWrite(outPin, HIGH);delay(t);digitalWrite(outPin, LOW); lcd.clear(); lcd.print("Extraction"); digitalWrite(outPin2, HIGH);delay(600);digitalWrite(outPin2, LOW);lcd.clear();delay(4000);
  if(buttonSTOP.pushed() or buttonSTOP.longPress()) buttonSTOPpushed = true;
  } while (buttonSTOPpushed == false);
  buttonSTOPpushed = false;
  }
  
}




[/code]