• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zmiana stanu pinu
#1
Tak jak w temacie, próbuje sterować przekaźnikiem z poziomu menubackend i wszystko działało ok, do czasu, aż wrzuciłem funkcje termometry().

Stan pinu po wciśnięciu przycisku zmienia się na moment i wraca do stanu poprzedniego.

Jakaś sugestia, co z czym się gryzie i jak to rozwiązać?

Kod:
/*
   Copyright Giuseppe Di Cillo (www.coagula.org)
   Contact: dicillo@coagula.org
   
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*
IMPORTANT: to use the menubackend library by Alexander Brevig download it at http://www.arduino.cc/playground/uploads/Profiles/MenuBackend_1-4.zip and add the next code at line 195
    void toRoot() {
        setCurrent( &getRoot() );
    }
*/
#include <MenuBackend.h>    //MenuBackend library - copyright by Alexander Brevig
#include <DS1307RTC.h>
#include <Time.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DS1307_ADDRESS 0x68

#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int buttonPinLeft = 4;      // pin for the Up button
const int buttonPinRight = 3;    // pin for the Down button
const int buttonPinEsc = 5;     // pin for the Esc button
const int buttonPinEnter = 2;   // pin for the Enter button

int lastButtonPushed = 0;

int nastaw = 25; // nastaw temperatury zalaczenia przekaznikow wentylatorow
int went_1 = 8; // pin przekaznika wentylatora 1
int went_2 = 9; // pin przekaznika wentylatora 2


int lastButtonEnterState = LOW;   // the previous reading from the Enter input pin
int lastButtonEscState = LOW;   // the previous reading from the Esc input pin
int lastButtonLeftState = LOW;   // the previous reading from the Left input pin
int lastButtonRightState = LOW;   // the previous reading from the Right input pin

volatile int his_1=0;
volatile int his_2=0;
byte state = LOW;
const char *monthName[12] = {
 "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze",
 "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"
};

DeviceAddress P1 = { 0x28, 0xFF, 0xB2, 0x4C, 0x65, 0x14, 0x1, 0x6F };
DeviceAddress P2 = { 0x28, 0xFF, 0xE, 0x97, 0x65, 0x14, 0x1, 0x94 };

long lastEnterDebounceTime = 0;  // the last time the output pin was toggled
long lastEscDebounceTime = 0;  // the last time the output pin was toggled
long lastLeftDebounceTime = 0;  // the last time the output pin was toggled
long lastRightDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 300;    // the debounce time

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Menu variables
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
//initialize menuitems
MenuItem miWentylator1 = MenuItem("Wentylator1");
 MenuItem miWen1_zal = MenuItem("Wen1_zal");
 MenuItem miWen1_wyl = MenuItem("Wen1_wyl");
MenuItem miWentylator2 = MenuItem("Wentylator2");
 MenuItem miWen2_zal = MenuItem("Wen2_zal");
 MenuItem miWen2_wyl = MenuItem("Wen2_wyl");

void setup()
{

 Serial.begin(9600);
 sensors.begin();
 sensors.setResolution(P1, 12);
 sensors.setResolution(P2, 12);
 Wire.begin();
 pinMode(went_1, OUTPUT);
 pinMode(went_2, OUTPUT);
 
 pinMode(buttonPinLeft, INPUT);
 pinMode(buttonPinRight, INPUT);
 pinMode(buttonPinEnter, INPUT);
 pinMode(buttonPinEsc, INPUT);
 digitalWrite(went_1, HIGH);
 digitalWrite(went_2, HIGH);


 lcd.begin(20, 4);



 //configure menu
 
 menu.getRoot().add(miWentylator1);
 miWentylator1.add(miWen1_zal).addRight(miWen1_wyl);
 miWentylator1.addRight(miWentylator2);
 miWentylator2.add(miWen2_zal).addRight(miWen2_wyl);
 miWentylator2.addRight(miWentylator1);

 menu.toRoot();





}  // setup()...


void loop()
{

 readButtons();  //I splitted button reading and navigation in two procedures because
 navigateMenus();  //in some situations I want to use the button for other purpose (eg. to change some settings)

 czasidata();
 termometry();
}
byte bcdToDec(byte val)  {
 return ( (val / 16 * 10) + (val % 16) );
} //loop()...


void czasidata() {
 tmElements_t tm;
 if (RTC.read(tm)) {
   lcd.setCursor (0, 0);
   LCDprint2digits(tm.Hour);
   lcd.print(':');
   LCDprint2digits(tm.Minute);
   lcd.print(':');
   LCDprint2digits(tm.Second);
   lcd.setCursor (9, 0);
   lcd.print(tm.Day);
   lcd.print('/');
   lcd.print(monthName[tm.Month-1]);
   lcd.print('/');
   lcd.print(tmYearToCalendar(tm.Year));
 } else {
   if (RTC.chipPresent()) {
     lcd.println("DS1307 stoi. Uruchom Zegar");
     }
      else {
     lcd.println("DS1307 blad oczczytu!");
     lcd.println("sprawdz polaczenie");
   }
 }
}

void termometry() {
 sensors.requestTemperatures();
 float tempC1 = sensors.getTempC(P1);
 float tempC2 = sensors.getTempC(P2);
 
 lcd.setCursor(11, 1);
 lcd.print("Max ");
 lcd.print(nastaw);
 lcd.write(byte(223));
 lcd.setCursor (0, 1);
 lcd.print(tempC1, 2);
 lcd.write(byte(223));
 if (sensors.getTempCByIndex(0)+his_1 < (nastaw)) {
   his_1=0;
   digitalWrite(went_1, HIGH);
   int val = digitalRead(went_1);
   if (val)
     lcd.setCursor(7, 1);
   lcd.print("Wyl");
 } else {
   his_1=1;
   digitalWrite(went_1, LOW);
   lcd.setCursor(7, 1);
   lcd.print("Zal");
 }
 lcd.setCursor (0, 2);
 lcd.print(tempC2, 2);
 lcd.write(byte(223));
 if (sensors.getTempCByIndex(1)+his_2 < (nastaw)) {
   his_2=0;
   digitalWrite(went_2, HIGH);
   int val = digitalRead(went_2);
   if (val)
     lcd.setCursor(7, 2);
   lcd.print("Wyl");
 } else {
   his_2=1;
   digitalWrite(went_2, LOW);
   lcd.setCursor(7, 2);
   lcd.print("Zal");
 }
}

void LCDprint2digits(int number) {
 if (number >= 0 && number < 10) {
   lcd.write('0');
 }
 lcd.print(number);
}


void menuChanged(MenuChangeEvent changed){
 
 MenuItem newMenuItem=changed.to; //get the destination menu
 
 lcd.setCursor(0,3); //set the start position for lcd printing to the second row
 
 if(newMenuItem.getName()==menu.getRoot()){
     lcd.print("Ustawienia       ");
 }else if(newMenuItem.getName()=="Wentylator1"){
     lcd.print("Wentylator1");
 }else if(newMenuItem.getName()=="Wen1_zal"){
     lcd.print("Wen1_zal   ");
 }else if(newMenuItem.getName()=="Wen1_wyl"){
     lcd.print("Wen1_wyl   ");
 }else if(newMenuItem.getName()=="Wentylator2"){
     lcd.print("Wentylator2");
 }else if(newMenuItem.getName()=="Wen2_zal"){
     lcd.print("Wen2_zal   ");
 }else if(newMenuItem.getName()=="Wen2_wyl"){
     lcd.print("Wen2_wyl   ");
 }
}

void menuUsed(MenuUseEvent used){
 lcd.setCursor(0,3);  
 lcd.print("Wykonano        ");
 lcd.setCursor(10,3);
 lcd.print(used.item.getName());
 delay(3000);  //delay to allow message reading
 lcd.setCursor(10,3);  
 lcd.print("                ");
 lcd.setCursor(10,3);  
 lcd.print("                ");
 if(used.item.getName()=="Wen1_zal")went1_zal(); // obsługa wentylatora 1
 if(used.item.getName()=="Wen1_wyl")went1_wyl(); // obsługa wentylatora 1
 if(used.item.getName()=="Wen2_zal")went2_zal(); // obsługa wentylatora 2
 if(used.item.getName()=="Wen2_wyl")went2_wyl(); // obsługa wentylatora 2

 menu.toRoot();  //back to Main
}


void  readButtons(){  //read buttons status
 int reading;
 int buttonEnterState=LOW;             // the current reading from the Enter input pin
 int buttonEscState=LOW;             // the current reading from the input pin
 int buttonLeftState=LOW;             // the current reading from the input pin
 int buttonRightState=LOW;             // the current reading from the input pin

 //Enter button
                 // read the state of the switch into a local variable:
                 reading = digitalRead(buttonPinEnter);

                 // check to see if you just pressed the enter button
                 // (i.e. the input went from LOW to HIGH),  and you've waited
                 // long enough since the last press to ignore any noise:  
               
                 // If the switch changed, due to noise or pressing:
                 if (reading != lastButtonEnterState) {
                   // reset the debouncing timer
                   lastEnterDebounceTime = millis();
                 }
                 
                 if ((millis() - lastEnterDebounceTime) > debounceDelay) {
                   // whatever the reading is at, it's been there for longer
                   // than the debounce delay, so take it as the actual current state:
                   buttonEnterState=reading;
                   lastEnterDebounceTime=millis();
                 }
                 
                 // save the reading.  Next time through the loop,
                 // it'll be the lastButtonState:
                 lastButtonEnterState = reading;
                 

   //Esc button              
                 // read the state of the switch into a local variable:
                 reading = digitalRead(buttonPinEsc);

                 // check to see if you just pressed the Down button
                 // (i.e. the input went from LOW to HIGH),  and you've waited
                 // long enough since the last press to ignore any noise:  
               
                 // If the switch changed, due to noise or pressing:
                 if (reading != lastButtonEscState) {
                   // reset the debouncing timer
                   lastEscDebounceTime = millis();
                 }
                 
                 if ((millis() - lastEscDebounceTime) > debounceDelay) {
                   // whatever the reading is at, it's been there for longer
                   // than the debounce delay, so take it as the actual current state:
                   buttonEscState = reading;
                   lastEscDebounceTime=millis();
                 }
                 
                 // save the reading.  Next time through the loop,
                 // it'll be the lastButtonState:
                 lastButtonEscState = reading;
                 
                   
  //Down button              
                 // read the state of the switch into a local variable:
                 reading = digitalRead(buttonPinRight);

                 // check to see if you just pressed the Down button
                 // (i.e. the input went from LOW to HIGH),  and you've waited
                 // long enough since the last press to ignore any noise:  
               
                 // If the switch changed, due to noise or pressing:
                 if (reading != lastButtonRightState) {
                   // reset the debouncing timer
                   lastRightDebounceTime = millis();
                 }
                 
                 if ((millis() - lastRightDebounceTime) > debounceDelay) {
                   // whatever the reading is at, it's been there for longer
                   // than the debounce delay, so take it as the actual current state:
                   buttonRightState = reading;
                  lastRightDebounceTime =millis();
                 }
                 
                 // save the reading.  Next time through the loop,
                 // it'll be the lastButtonState:
                 lastButtonRightState = reading;                  
                 
                 
   //Up button              
                 // read the state of the switch into a local variable:
                 reading = digitalRead(buttonPinLeft);

                 // check to see if you just pressed the Down button
                 // (i.e. the input went from LOW to HIGH),  and you've waited
                 // long enough since the last press to ignore any noise:  
               
                 // If the switch changed, due to noise or pressing:
                 if (reading != lastButtonLeftState) {
                   // reset the debouncing timer
                   lastLeftDebounceTime = millis();
                 }
                 
                 if ((millis() - lastLeftDebounceTime) > debounceDelay) {
                   // whatever the reading is at, it's been there for longer
                   // than the debounce delay, so take it as the actual current state:
                   buttonLeftState = reading;
                   lastLeftDebounceTime=millis();;
                 }
                 
                 // save the reading.  Next time through the loop,
                 // it'll be the lastButtonState:
                 lastButtonLeftState = reading;  

                 //records which button has been pressed
                 if (buttonEnterState==HIGH){
                   lastButtonPushed=buttonPinEnter;

                 }else if(buttonEscState==HIGH){
                   lastButtonPushed=buttonPinEsc;

                 }else if(buttonRightState==HIGH){
                   lastButtonPushed=buttonPinRight;

                 }else if(buttonLeftState==HIGH){
                   lastButtonPushed=buttonPinLeft;

                 }else{
                   lastButtonPushed=0;
                 }
}

void navigateMenus() {
 MenuItem currentMenu=menu.getCurrent();

 switch (lastButtonPushed){
   case buttonPinEnter:
     if(!(currentMenu.moveDown())){  //if the current menu has a child and has been pressed enter then menu navigate to item below
       menu.use();
     }else{  //otherwise, if menu has no child and has been pressed enter the current menu is used
       menu.moveDown();
      }
     break;
   case buttonPinEsc:
     if(!(currentMenu.moveUp())){
       menu.toRoot();
     }else{
       menu.moveUp();
      }
     break;
   case buttonPinRight:
     menu.moveRight();
     break;
   case buttonPinLeft:
     menu.moveLeft();
     break;
 }
 lastButtonPushed=0; //reset the lastButtonPushed variable
}


void went1_zal()
{
 if(digitalRead(went_1) == HIGH) {
   digitalWrite(went_1, LOW);
 }
 else
 {
   digitalWrite(went_1, HIGH);
 }
}



void went1_wyl()
{
 if(digitalRead(went_1) == LOW) {
   digitalWrite(went_1, HIGH);
 }
 else
 {
   digitalWrite(went_1, LOW);
 }
}

void went2_zal()
{
 if(digitalRead(went_2) == HIGH) {
   digitalWrite(went_2, LOW);
 }
 else
 {
   digitalWrite(went_2, HIGH);
 }
}

void went2_wyl()
{
 if(digitalRead(went_2) == LOW) {
   digitalWrite(went_2, HIGH);
 }
 else
 {
   digitalWrite(went_2, LOW);
 }
}
 
#2
Z tego co widzę t nie masz wykluczenia coś w tym stylu

if wentek działa z backend to nie wyłączaj go termometrem

ponieważ po włączeniu ręcznym termometr sprawdza temperaturę i wyłącza go z automatu w kolejnym cyklu programu
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#3
Dziękuje za odpowiedz JasQ-u, na Ciebie zawsze można liczyć, ale cały czas się głowie, jaki warunek dać, żeby wykluczyć pomiar temperatury z czujnika na czas ręcznego włączenia przekaźnika.

Poza tym, ta wersja menubackend bardzo mi się podoba i fajnie działa na 4 przyciski, problem w tym, że od dwóch dni siedzę i rozkminiam, jak przerobić Wojtka funkcje np. sterowania zakresem temperatury, pod tą nawigacje i odczyt przycisków.
 
#4
daj backend_state w przypadku uruchomienia przez backend , backend_state = 1

a przed linijką daj na całość wykluczenie
if ( backend_state !=1 ){
if (sensors.getTempCByIndex(0)+his_1 < (nastaw))........
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#5
Super, działa, dziękuje! Smile Zamknij proszę ten temat, pewnie niebawem otworze kolejny.
 
#6
No to super , zamykam Wink
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
  


Skocz do:


Przeglądający: 1 gości