Jak dopisać ograniczenie czasowe funkcji?

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Jak dopisać ograniczenie czasowe funkcji?

Post autor: sztapl » 20 lis 2016, 13:18

Mam taki program:
int foto;
int tempoil;
int i;
int oil;

int pushButton1 = 12;
int pushButton2 = 13;
#include <EEPROM.h>
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2) ;

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  pinMode(pushButton1, INPUT_PULLUP);
  pinMode(pushButton2, INPUT_PULLUP);
  oil = EEPROM.read(0);
  i = EEPROM.read(1);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  

  pinMode(3, INPUT_PULLUP); //zarowanie awarii
  pinMode(4, INPUT_PULLUP); //pływak
  pinMode(A0,INPUT); //foto
  pinMode(5,OUTPUT);//pompa
  pinMode(6,OUTPUT); //iskra
  pinMode(7,OUTPUT); //wentylator
  pinMode(8,OUTPUT); //grzalka
  pinMode(9,OUTPUT); //elektrozawor
  pinMode(10,OUTPUT);//awaria
  pinMode(11,OUTPUT);//grzalka drazka
 
  digitalWrite(5,LOW);//pompa
  digitalWrite(6,LOW); //iskra
  digitalWrite(7,LOW); //wentylator
  digitalWrite(8,LOW); //grzalka
  digitalWrite(9,LOW); //elektrozawor
  digitalWrite(10,LOW);//awaria
  digitalWrite(11,LOW);//grzanie drazka dyszy
  sensors.begin();
  
}

void loop(){
    int buttonState1 = digitalRead(pushButton1);
  int buttonState2 = digitalRead(pushButton2);

if (buttonState1 == LOW) {
  oil++;
  delay(1);
 EEPROM.write(0, oil);
}

if (buttonState2 == LOW) {
  oil--;
  delay(1);
    
  EEPROM.write(0, oil);
}
   
    sensors.requestTemperatures(); // Send the command to get temperatures
float tempoil = (sensors.getTempCByIndex(0));

 
  foto = analogRead(0);
digitalWrite(11,HIGH);

  if ( i<3 && foto<300 && tempoil>oil && digitalRead(4)==HIGH) //brak płomienia , 3 pruby , olej zagzany i dopompowany
  {
    on();   // wykonaj sekwencje zapłonu
  
    check(); //wykonaj sekwencje check
    
}      
   

   if(i==3) // 3 pruby i brak zapłonu
  {
   if (digitalRead(3)==LOW) { // zerowanie awarii
  i=0;
  EEPROM.write(1, i);
}
EEPROM.write(1, i);
   awaria();                        // awaria
  }
 
  if (digitalRead(4)==LOW && i<3){ //kontrola oleju ,
    digitalWrite(5,HIGH); //pompuje
  lcd.setCursor(0,0);
  lcd.print ("POMPUJE OLEJ ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
           if (foto<300){ //kontrola foto
             digitalWrite(9,LOW);
           }
  }
else {
  digitalWrite(5,LOW);
  
}


  if (tempoil<oil && i<3 && digitalRead(4)==HIGH){ //kontrola temp , !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
    digitalWrite(8,HIGH); //pompuje
  lcd.setCursor(0,0);
  lcd.print ("PODGRZEWAM OLEJ ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
  delay(100);
             if (foto<300){ //kontrola foto
             digitalWrite(9,LOW);
           }
  }
else {
  digitalWrite(8,LOW);
  
}






  if (digitalRead(4)==HIGH && foto>300 && i<3 && tempoil>oil){ // praca palnika,
  lcd.setCursor(0,0);
  lcd.print (" PALNIK PRACUJE ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
  }


}



  
void on () { // Procedura zaplonu
  {


   
    lcd.setCursor(0,0);
    lcd.print(" PROCEDURA ");
    lcd.setCursor(0,1);
    lcd.print (" ZAPLONU ");
    
    digitalWrite(5,LOW); //wylaczam pompe
    digitalWrite(6,LOW); // wylczam iskre
    digitalWrite(7,LOW); // wylczam wentylator
    digitalWrite(8,LOW); //wylczam grzalke
    digitalWrite(9,LOW); // wylczam elektrozawor
    
    digitalWrite(7,HIGH); // wlczam wentylator
    delay(5000); // czekaj 5 s wentyluje piec
    digitalWrite(6,HIGH); // podaje iskre
    delay(1000); // czekam 1 sekunde
    digitalWrite(9,HIGH); // wlczam elektrozawor, nastepuje zaplon
    delay (10000); // 10 sekund na zaplon

        
  }
  
  }


void check()
{
 
  foto = analogRead(0); // odczyt fotokomorki
       

    if (i<3 && foto>300 ) // , jest plomien przechodzi do pracy
    {
  
   i=0;
    praca ();
    }
    
    else
    {
  
    i++;
      
    }
    
           
  } 
  
  
void praca() {

   digitalWrite(6,LOW); // wylczam iskre
   digitalWrite(9,HIGH); // wlczam elektrozawor
   digitalWrite(7,HIGH); // wlczam wentylator
   digitalWrite(10,LOW); //zeruje awarie
  lcd.setCursor(0,0);
  lcd.print (" Palnik pracuje ");
  lcd.setCursor(0,1);
  lcd.print(" prawidlowo ");
    }
   
void awaria ()
{
   digitalWrite(5,LOW); //wylaczam pompe
   digitalWrite(6,LOW); // wylaczam iskre
   digitalWrite(7,LOW); // wylaczam powietrze
   digitalWrite(8,LOW); // wylaczam grzalke
   digitalWrite(9,LOW); // wylaczam elektrozawor
   digitalWrite(10,HIGH);//awaria
   digitalWrite(11,LOW);//drazek dyszy

  lcd.clear();
  lcd.print (" AWARIA PALNIKA");
  delay (500);
    
  
}
Jak zrobić żeby przy kontroli oleju dopompowywanie ( digitalWrite(5,HIGH); //pompuje ) nie mogło trwać więcej niż np. 20 sekund a po zadanym czasie jeżeli nie dopompowało powinno zmienić i=3 a wtedy wiadomo wyskoczyła by awaria. No i najważniejsze nie może to blokować trwania pętli programu bo program musi cały czas sprawdzać fotkę. Domyślam się że funkcja milis ale nie bardzo wiem jak się do tego zabrać.


Ważne: Nie ponoszę odpowiedzialności za szkody wyrządzone w skutek używania mojego wsadu!!! Palniki to nie zabawki!!! Wsad jest opracowywany w celach EDUKACYJNYCH może i na pewno zawiera błędy !!! Jeżeli go używasz robisz to na własną odpowiedzialność!!!

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Jak dopisać ograniczenie czasowe funkcji?

Post autor: Slawek » 20 lis 2016, 15:28

Definicje zmiennych :

Kod: Zaznacz cały

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int przerwa_odczyt = 20000; // 20s

A to umieść z procedurze pompowania :

Kod: Zaznacz cały

currentMillis = millis();
   if (currentMillis - previousMillis <= przerwa_odczyt) 
   {
       digitalWrite(5,HIGH);
   } else {
       previousMillis = currentMillis;
       i = 3;
  }
Jak rozumiem, program sprawdza inne warunki czyli to digitalWrite(5,HIGH); powinno się w przypadku prawidłowej pracy zakończyć wcześniej, jeżeli się nie skończy to jest odcięcie powyżej 20s. W przypadku i=3 czyli awarii po wyłaczeniu wszystkiego i komunikacie należy zresetować zmienną "i" do normalnego stanu.

Pozdr
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Jak dopisać ograniczenie czasowe funkcji?

Post autor: sztapl » 20 lis 2016, 17:27

Dobrze zrozumiałeś o c mi chodzi. Dzisiaj sprawdzę w praktyce. Wielkie dzięki!!!
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Jak dopisać ograniczenie czasowe funkcji?

Post autor: sztapl » 22 lis 2016, 16:18

Niestety nie działa. wywala awarię od razu po włączeniu pompowania. Masz jakiś pomysł?
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Jak dopisać ograniczenie czasowe funkcji?

Post autor: sztapl » 22 lis 2016, 19:46

Z chęcią wstawię według znacznika

Kod: Zaznacz cały

 ale nie bardzo wiem jak. Powinno być gdzieś podpięte żeby łatwo było znaleźć. Dzięki za usunięcie zbędnych wpisów.
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Jak dopisać ograniczenie czasowe funkcji?

Post autor: sztapl » 22 lis 2016, 19:52

Znalazłem jak a raczej pokombinowałem i działa już mi

Kod: Zaznacz cały


[code]

int foto;
int tempoil;
int i;
int oil;

int pushButton1 = 12;
int pushButton2 = 13;
#include <EEPROM.h>
#include <OneWire.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2) ;  

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {      
  pinMode(pushButton1, INPUT_PULLUP);
  pinMode(pushButton2, INPUT_PULLUP);
  oil = EEPROM.read(0);
  i = EEPROM.read(1);
  lcd.init();                      
  lcd.backlight();
  lcd.clear();
  

  pinMode(3, INPUT_PULLUP); //zarowanie awarii
  pinMode(4, INPUT_PULLUP); //pływak
  pinMode(A0,INPUT); //foto
  pinMode(5,OUTPUT);//pompa
  pinMode(6,OUTPUT); //iskra
  pinMode(7,OUTPUT); //wentylator
  pinMode(8,OUTPUT); //grzalka
  pinMode(9,OUTPUT); //elektrozawor
  pinMode(10,OUTPUT);//awaria 
  pinMode(11,OUTPUT);//grzalka drazka
 
  digitalWrite(5,LOW);//pompa
  digitalWrite(6,LOW); //iskra
  digitalWrite(7,LOW); //wentylator
  digitalWrite(8,LOW); //grzalka
  digitalWrite(9,LOW); //elektrozawor
  digitalWrite(10,LOW);//awaria
  digitalWrite(11,LOW);//grzanie drazka dyszy
  sensors.begin();
  
}

void loop(){
    int buttonState1 = digitalRead(pushButton1);
  int buttonState2 = digitalRead(pushButton2);

if (buttonState1 == LOW) {
  oil++;
  delay(1);
 EEPROM.write(0, oil); 
}

if (buttonState2 == LOW) {
  oil--;
  delay(1);
    
  EEPROM.write(0, oil);
}
   
    sensors.requestTemperatures(); // Send the command to get temperatures
float tempoil = (sensors.getTempCByIndex(0));

 
  foto = analogRead(0);
digitalWrite(11,HIGH);

  if ( i<3  && foto<300 && tempoil>oil && digitalRead(4)==HIGH)   //brak płomienia , 3 pruby , olej zagzany i dopompowany
  {
    on();   // wykonaj sekwencje zapłonu         
  
    check(); //wykonaj sekwencje check
    
}      
   

   if(i==3) // 3 pruby i brak zapłonu
  {
   if (digitalRead(3)==LOW) {        // zerowanie awarii
  i=0;
  EEPROM.write(1, i);
}
EEPROM.write(1, i);
   awaria();                        // awaria
  }
 
  if (digitalRead(4)==LOW  && i<3){  //kontrola oleju ,
    digitalWrite(5,HIGH); //pompuje
  lcd.setCursor(0,0);  
  lcd.print ("POMPUJE OLEJ    ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
           if (foto<300){          //kontrola foto
             digitalWrite(9,LOW);
           }
  }
else {
  digitalWrite(5,LOW);
  
}


  if (tempoil<oil  && i<3 && digitalRead(4)==HIGH){  //kontrola temp ,    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
    digitalWrite(8,HIGH); //pompuje
  lcd.setCursor(0,0);
  lcd.print ("PODGRZEWAM OLEJ ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
  delay(100);
             if (foto<300){      //kontrola foto
             digitalWrite(9,LOW);
           }
  }
else {
  digitalWrite(8,LOW);
  
}






  if (digitalRead(4)==HIGH && foto>300 && i<3 && tempoil>oil){        // praca palnika, 
  lcd.setCursor(0,0);
  lcd.print (" PALNIK PRACUJE ");
  lcd.setCursor(0,1);
  lcd.print (tempoil);
  lcd.print (" 'C / " );
  lcd.print (oil);
  lcd.print ("'C");
  }


}



  
void on () {    // Procedura zaplonu 
  {


   
    lcd.setCursor(0,0);
    lcd.print("   PROCEDURA    ");  
    lcd.setCursor(0,1);
    lcd.print ("    ZAPLONU     "); 
    
    digitalWrite(5,LOW); //wylaczam pompe
    digitalWrite(6,LOW); //  wylczam iskre
    digitalWrite(7,LOW); // wylczam wentylator
    digitalWrite(8,LOW); //wylczam grzalke
    digitalWrite(9,LOW); // wylczam elektrozawor
    
    digitalWrite(7,HIGH); // wlczam wentylator
    delay(5000); // czekaj 5 s  wentyluje piec
    digitalWrite(6,HIGH); // podaje iskre
    delay(1000); // czekam 1 sekunde
    digitalWrite(9,HIGH); // wlczam elektrozawor, nastepuje zaplon
    delay (10000);        // 10 sekund na zaplon

        
  }
  
  }


void check() 
{
 
  foto = analogRead(0);                        // odczyt fotokomorki
       

    if (i<3 && foto>300 )  // , jest plomien przechodzi do pracy
    {
  
   i=0;
    praca ();
    }
    
    else 
    {
  
    i++;
      
    }
    
           
  } 
  
  
void praca() {

   digitalWrite(6,LOW); // wylczam iskre
   digitalWrite(9,HIGH); // wlczam elektrozawor    
   digitalWrite(7,HIGH); // wlczam wentylator 
   digitalWrite(10,LOW); //zeruje awarie
  lcd.setCursor(0,0);
  lcd.print (" Palnik pracuje ");
  lcd.setCursor(0,1);
  lcd.print("   prawidlowo   ");
    }
   
void awaria ()
{
   digitalWrite(5,LOW); //wylaczam pompe
   digitalWrite(6,LOW); // wylaczam iskre
   digitalWrite(7,LOW); // wylaczam powietrze 
   digitalWrite(8,LOW); //  wylaczam grzalke 
   digitalWrite(9,LOW); // wylaczam elektrozawor      
   digitalWrite(10,HIGH);//awaria
   digitalWrite(11,LOW);//drazek dyszy

  lcd.clear();
  lcd.print (" AWARIA PALNIKA");
  delay (500);
    
  
}


ODPOWIEDZ

Strony partnerskie: