нужна помощь в правке скетча
- Войдите на сайт для отправки комментариев
Пт, 17/10/2014 - 16:48
Добрый день .
Нужна помощь вправке или переписи скетча. Данный скетч нужен для управления нагрузками (их три пока) во время работы эл. станции + управление сервой (связан с рубильником) переключает нагрузку на городскую или резервную линию.
Сам уже два месяца топчусь на месте.
Проблема: в моём коде не выходит сразу из цикла переключения нагрузок
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;}
}
}
}
а зачем рубильник? не лучше ли контактор (мощное рэле) поставить
можно и авр собрать
В дизель станции есть свой полнофункциональный АВР, контакторы стоят (только электросети прикололись, затребовали установку перекидного рубильника).
И нагрузки раза в три больше чем мощности электростанции.Поэтому гимр с переключением нагрузки.
Рубильник с сервоприводом и концевиками уже скрестил прикольно получилось.
delay(del);//подождали82 строка. не удивительно что не выходит :). это команда блокирующая.
надо делать
unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; <действия, которые необходимо отсрочить> }Напишите на почту, возможно смогу помочь за небольшое вознаграждение...
aleks-faza@yandex.ru
Вы про break в if? i=12; вместо break.
хз че я тут наредактировал
#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; } } }Спасибо всем, roman2712 помог уже
[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]для начала код по правилам вставьте
Еслиб я знал как!
[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]