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ć?
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);
}
}