Печка для сауны с управлением на Ардуино Нано (Проект новичка)

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Всем доброго времени суток!!

Предпосылки к созданию проекта:

У соседа в сауне финская электропечка, дом в деревне, а наши татарские электрики любят жестоко шутить над населением. Вот после очередной шутки отказал блок управления:

как показал разбор, сгорел PIC контроллер, ключи управления релюшками, диоды на плате реле. заменить все не трудно, проблема с программой для пикушки. А поскольку меня давно привлекала тема ардуино, решил попробовать.

Состав проекта:

Ардуино нано

MAX7219 и то, что осталось живым на плате управления.

 

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

схему собрать было не сложно, даже в протеусе нарисовал все, а вот скетч меня озадачил:

// Версия 1.3 29.01.15 работает термометр и две кнопки - включения и подсветки
// настраиваем кнопки установки температуры
// проект управления печкой сауны, Arduino Nano, 7сегментный трехразрядный дисплей,
// драйвер дисплея MAX7219, шесть кнопок управления, датчик температуры Dallas
// Подключаем библиотеку для работы с шиной OneWire
#include <OneWire.h>
// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>
// Термометр будет подключен на Pin3
OneWire oneWire(3);
//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>
//Подключаем библиотеку для работы с дисплеем
#include <LedControl.h>
// присваиваем адрес дисплею
LedControl lc=LedControl(12,11,10,1);
#define ONE_WIRE_BUS 3
//подключаем библиотеку Bounce
#include <Bounce.h>;
// разбираемся с кнопками:
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON1 9     // кнопка выключения
#define OFF 18        //выход выключателя
#define BUTTON 8      //кнопка подсветки
#define LED 19        //выход подсветки
#define BUTTONTEMP 7  //кнопка установки температуры
#define BUTTONTIME 6  //кнопка установки ВРЕМЕНИ
#define UP 5          //кнопка увеличения значения
#define DOWN 4        //кнопка уменьшения значения
#define OUTHET1 16    //выход нагревателя 1
#define OUTHET2 17    //выход нагревателя 2
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,2); 

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncor = Bounce(BUTTON1,2); 
//==================================================================================================
//обозначаем кнопки меню
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(BUTTONTEMP,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer2 = Bounce(BUTTONTIME,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer3 = Bounce(UP,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer4 = Bounce(UP,2); 
//===================================================================================================
//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;
//задаем начальное состояние прибора
int OFFValue = LOW;
//Обьявляем состояние выходов нагревателей
int outhet1Status=LOW;
int outhet2Status=LOW;

//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры

DallasTemperature sensors(&oneWire);

//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
float T;        //переменная для хранения температуры
int setTmp=0;   // переменная для заданного значения температуры
int T1;         // переменная текущей температуры
int ones;
int tens;
int hundreds;
//

void setup() {

  
 //определяем режимы работы пинов
  pinMode(BUTTON,INPUT);
  pinMode(LED,OUTPUT);
  pinMode(BUTTON1,INPUT);
  pinMode(OFF,OUTPUT);
  pinMode(OUTHET1,OUTPUT);
  digitalWrite(OUTHET1,LOW);
  pinMode(OUTHET2,OUTPUT);
  digitalWrite(OUTHET2,LOW);
  

lc.clearDisplay(0);// clear screen
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,7);// sets brightness (0~15 possible values)
lc.setScanLimit(1, 3);


sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(12);
}

void loop(void)
{

  //если сменилось состояние кнопки
  if ( bouncor.update() ) 
  {
    //если считано значение 1
    if ( bouncor.read() == HIGH) {
     //если свет был выключен, будем его включать
     if ( OFFValue == LOW ) {
       OFFValue = HIGH;
     //если свет был включен, будем выключать
     } 
     else {
       OFFValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(OFF,OFFValue);
    }
  }
{
  //если сменилось состояние кнопки
  if ( bouncer.update() ) {
    //если считано значение 1
    if ( bouncer.read() == HIGH) {
     //если свет был выключен, будем его включать
     if ( ledValue == LOW ) {
       ledValue = HIGH;
     //если свет был включен, будем выключать
     } else {
       ledValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(LED,ledValue);
    }
  }
}
//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1) 
  

    previousMillis1 = currentMillis1;  

//Запуск процедуры измерения температуры
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);


//Считывание значения температуры
  sensors.getAddress(tempDeviceAddress, 0);
  T=sensors.getTempC(tempDeviceAddress);
 
//sensors.requestTemperatures(); // Send the command to get temperatures
//T=(sensors.getTempCByIndex(0));
 
T1 = T*10;
      
hundreds = T1/100;
                
tens=(T1-hundreds*100)/10;
     
ones=T1-(hundreds*100+tens*10);
     
lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false);
 
  }

На сей момент есть отображение информации с датчика температуры Dallas DS18B20, работают кнопка включения и подсветки

И как говорится, на этом ступор!

Уважаемые гуру программирования! Пожалуйста, помогите с составлением меню, перерыл весь инет, перепробовал массу комбинаций, не получается решить простой алгоритм (не для меня простой) :

Есть четыре кнопки: ТЕМПЕРАТУРА, ВРЕМЯ, UP, DOWN.

Надо реализовать: при нажатии на кнопку ТЕМПЕРАТУРА кнопками UP & DOWN выставляется значение температуры и заносится в память после нажатия кнопки ТЕМПЕРАТУРА и такой же алгоритм со временем, при Нажатии на кнопку ВРЕМЯ кнопками UP&DOWN выставляется время и заносится в память после нажатия кнопки ВРЕМЯ.

Пожалуйста, помогите хотя бы ссылку на аналогичный алгоритм, сосед уже заел, я с этой темой два месяца колупаюсь.

хотел выложить фотографии и схемы, но тут не грузится больше одной фотки или я чего то не пойму...

Спасибо заранее!!!

Looka
Offline
Зарегистрирован: 24.04.2012

Ну а вопрос то в чем?

Сделать Вам проект?   Поругать Ваших электриков? 

Решили попробовать - пробуйте!   Будут конкретные вопросы - формулируйте, Вам обязательно помогут.

Но начинать с печки, я бы не советовал...... 

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

вопрос в меню из трех кнопок, не смог найти ни одного примера, хотябы в какую сторону копать подскажите, а может есть кусок кода?

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Я извиняюсь, а может кто подскажет, почему больше одной фотки не грузится, здесь ограничение по размеру или по количеству стоит? 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Bobrov.Anatoliy пишет:

вопрос в меню из трех кнопок, не смог найти ни одного примера, хотябы в какую сторону копать подскажите, а может есть кусок кода?


Копвйте гугл, там этих меню как грязи

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Ребят, я понимаю, вам кажется на вскидку вопрос выеденного яйца не стоит, но поверьте, месяц уже рою, в такой простой комплектации, когда кнопки напрямую подключены к цифровым пинам, а индикация идет через MAX7219 на семиразрядник нигде нет, ни у кого не видел, наверное это очень просто, но я программирование занялся месяца два назад, и этот раздел для меня китайская грамота, кроме того, если получится, я думаю, много таких, как я будут благодарны. Подскажите плиз!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

(Показывает средний палец)
Что тут еще можно показать? Тоска зеленая, берете тетрадку и карандаши и рисуете алгоритм. Переносите его в код.

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

/sites/default/files/u5748/sauna.png

так выглядит схема, я думаю, так понятнее, чего я хочу?

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Puhlyaviy пишет:
(Показывает средний палец) Что тут еще можно показать? Тоска зеленая, берете тетрадку и карандаши и рисуете алгоритм. Переносите его в код.

 

Ну что тут скажешь, остается надеяться, что остались еще отзывчивые люди в земле русской... 

 

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

А Вы знаете, вот этот палец из ступора то и вывел, карандаш и бумага помогли!!! пошел спать, завтра выложу результат, СПАСИБО!!!!!!!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Bobrov.Anatoliy пишет:

 

Ну что тут скажешь, остается надеяться, что остались еще отзывчивые люди в земле русской... 

 


в земле русской остались лентяи и халявщики... вас таких тут каждый день очередь собирается. .. взывающих к земле, взаимопомощи, сознательности и тд... но не желающих даже пальцем шевельнуть... расказывающих что каждый должен заниматься своим делом и что вот если бы кому то понадобилось корову подоить, то вы бы с радостью за бесплатно любого быка бы довели до иступления...
хотите учиться, начните с построения алгоритмов,
хотите халявы , ждите когда там кто то с земли вам поможет

inspiritus
Offline
Зарегистрирован: 17.12.2012

Таварисч дарагой . Поможет Вам линейное меню , запихнутое в сетуп и отзывающееся после ресета. 

На системные вопросы, свидетельствующие об отсутствии всего , типа "вот вам всё моё (или чьётто еще -код, схема и комменты), скажите что тут не так ( херегознаеткак)" , скорее всего Вы ответ не получитe. 

Правильный вопрос пишется так: я делал так ( код) , так (код) , еще так и так (многа правильно выложеннога кода) , после  анализа ( тотто и тотто ) мне предполагается, что проблема в строках (...) , что скажет СТАЯ?   :)

" психолог на больничном, по всем вопросам обращаться к участковому гинекологу :)"

bwn
Offline
Зарегистрирован: 25.08.2014

Puhlyaviy пишет:
Bobrov.Anatoliy пишет:

 

Ну что тут скажешь, остается надеяться, что остались еще отзывчивые люди в земле русской... 

 

в земле русской остались лентяи и халявщики... вас таких тут каждый день очередь собирается. .. взывающих к земле, взаимопомощи, сознательности и тд... но не желающих даже пальцем шевельнуть... расказывающих что каждый должен заниматься своим делом и что вот если бы кому то понадобилось корову подоить, то вы бы с радостью за бесплатно любого быка бы довели до иступления... хотите учиться, начните с построения алгоритмов, хотите халявы , ждите когда там кто то с земли вам поможет

Это, попросил бы не обобщать.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bwn пишет:

Это, попросил бы не обобщать.


Ой,остальных настолько мало, что их количеством можно принебречь. :)

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Bobrov.Anatoliy пишет:

...

Уважаемые гуру программирования! Пожалуйста, помогите с составлением меню, перерыл весь инет, перепробовал массу комбинаций, не получается решить простой алгоритм (не для меня простой) :

Есть четыре кнопки: ТЕМПЕРАТУРА, ВРЕМЯ, UP, DOWN.

Надо реализовать: при нажатии на кнопку ТЕМПЕРАТУРА кнопками UP & DOWN выставляется значение температуры и заносится в память после нажатия кнопки ТЕМПЕРАТУРА и такой же алгоритм со временем, при Нажатии на кнопку ВРЕМЯ кнопками UP&DOWN выставляется время и заносится в память после нажатия кнопки ВРЕМЯ.

Пожалуйста, помогите хотя бы ссылку на аналогичный алгоритм, сосед уже заел, я с этой темой два месяца колупаюсь.

хотел выложить фотографии и схемы, но тут не грузится больше одной фотки или я чего то не пойму...

 

Спасибо заранее!!!

Сосед тоже за "Спасибо заранее!!!" заел?  :)

Можно посоветовать, как культурно послать соседа. )))

 

bwn
Offline
Зарегистрирован: 25.08.2014

Здесь кусочек с меню, адаптируйте под себя.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bwn пишет:

Здесь кусочек с меню, адаптируйте под себя.


Уверен что твоё меню ровно для его количества кнопок? Почитай, проблема не в примерах меню, а в том что не знает куда кнопки девать. :)

bwn
Offline
Зарегистрирован: 25.08.2014

Puhlyaviy пишет:
bwn пишет:

Здесь кусочек с меню, адаптируйте под себя.

Уверен что твоё меню ровно для его количества кнопок? Почитай, проблема не в примерах меню, а в том что не знает куда кнопки девать. :)

Ну, если и функцию key() под себя переписать не сможет, тады я пас((((

Looka
Offline
Зарегистрирован: 24.04.2012

Узкое место у Вас   установка значений температуры и чего то там еще. 

Начните действительно с Алгоритма.    Попробуйте его макимально упростить.   Сделайте тестовый пример, чем меньше тем лутчше,  тогда Вам проще будет помочь.   Напишиите что не получается. Тогда больше шансов что Вам помогут, в любом коде  что бы разобраться, найти ошибки и еще и подсказать нужно время.  И чем больше код тем больше времени  на это требуется,  тем меньше участников форума Вам сможет помочь и тем лутчше разберетесь сами, и проблема возможно рассосется......

Расскажу свой пример. Код  порядка  двух сотен строк.  Не работает адекватно.  Все вроде просто, но виснит.  Первый посыл - написать на форуме, помогите, баг компилятора.   Но прежде чем обращаться к Ув. сообществу решил выделить проблему и сократить код  до минимума,  дабы  четко обозначить проблему.   И когда осталось уже десяток строк, сам обнаружил что в функции объявлена переменная  которую я считал глобальной.    Написал лишний  int   (  должно было быть:  GlobalP = 25;   я автоматом написал int Global25 = 25)...... 

Ну и еще по Вашему вопросу.   Быть может проще будет реализовать такой алгоритм,   параметр меняется при нажатии соответствующей кнопки,  удерживаете кнопку температура и  нжимаете UP или Down - соответственно меняется температура.  удерживаете кнопку время - меняете параметр время.    А в память заносите когда отпускаете соответсвующую кнопку. 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Уважаемый Bobrov.Anatoliy, у меня есть муфельная печь в которой я обжигаю детали определенное время, так что задача похожая на Вашу. Я тоже хотел сделать меню, кнопки, память но потом решил сделать по другому, и как для меня то удобней.

Взял 4 переменных резистора и установил на переднюю панель сюда же сегментник, сверху 1 кнопка для старта/остановки таймера.

2 резистора для установки температуры (Шкала 1я - 0,100,200, и.тд до 1000) (Шкала 2я - 0,10,20, и.тд до 90), точность 10 градусов меня устраивает.

2 резистора для установки таймера (шкала 1я - 0,1м,2м и.тд до 10мин) (шкала 2я - 0,10с,20с и.тд до 50сек) точность 10 секунд меня устраивает, (разбить можно и по другому)

Преимущества, на мой взгляд такие - Не нужно лезть в меню, заносить в память, считывать с памяти, Достаточно посмотреть на лицевую панель и видно по шкале заданную температуру, по сегментнику текущую и при желании изменить, покрутив ручку.

Тоже самое и с таймером можно менять значение даже при его работе.

Подумайте, может и соседу будет проще регулировать таким образом

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Может из утюга выковырять регулятор и на печку его. Ваще никаких ардуино.

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

==

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

vosara пишет:

Уважаемый Bobrov.Anatoliy, у меня есть муфельная печь в которой я обжигаю детали определенное время, так что задача похожая на Вашу. Я тоже хотел сделать меню, кнопки, память но потом решил сделать по другому, и как для меня то удобней.

Взял 4 переменных резистора и установил на переднюю панель сюда же сегментник, сверху 1 кнопка для старта/остановки таймера.

2 резистора для установки температуры (Шкала 1я - 0,100,200, и.тд до 1000) (Шкала 2я - 0,10,20, и.тд до 90), точность 10 градусов меня устраивает.

2 резистора для установки таймера (шкала 1я - 0,1м,2м и.тд до 10мин) (шкала 2я - 0,10с,20с и.тд до 50сек) точность 10 секунд меня устраивает, (разбить можно и по другому)

Преимущества, на мой взгляд такие - Не нужно лезть в меню, заносить в память, считывать с памяти, Достаточно посмотреть на лицевую панель и видно по шкале заданную температуру, по сегментнику текущую и при желании изменить, покрутив ручку.

Тоже самое и с таймером можно менять значение даже при его работе.

Подумайте, может и соседу будет проще регулировать таким образом

Спасибо большое за совет, но тут уже пошло дело принципа, понимаете, доказать себе что могу, да, есть простые варианты, более удобные, но как то так сложилось, сначала не хотелось менять лицевую панель, да и казалось, куда проще, выпаять один микропроцессор и вставить другой.

Долго писал код, подбирал куски из программ, для себя, для души, ведь это такое удовольствие, когда он выполняется так, как ты задумал! Сейчас подошел к стадии, когда забрезжил свет в конце проекта, а тут ступор, ну так бывает, нужен толчек, вот я и решился выложить на форум.

Ну Вы видите, люди разные, конечно, неприятно, когда на тебя наезжают, казалось бы не хочешь помочь, не пиши ничего, пройди мимо, обидно, но с другой стороны, есть и такие как Вы, просто добрый совет или подскажут, что я не так пишу или спрашиваю, да даже тот, что флудит распальцовкой  Puhlyaviy, или Looka

и тоже полезного дал, из ступора вывел, я взял листок, написал блок схему и по ней состряпал код, конечно корявый, но работает. Только после таких что-то не хочется больше ничего спрашивать.

Спасибо большое всем, кто хотя бы с поддержкой подумал о моих потугах, спасибо за ваше время и советы!!!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

С кнопками попробуйте вот так 

bool kn_c=0;

void loop()
{

if ( bouncor.update() )
{
 if ( bouncor.read() == Low && kn_c==0) 
 {
  kn_c=1;
 }

if (kn_c)
{
  if (kn_up)
  {
    ++temperatura;
    delay(25);
  }
if (kn_down)
  {
    --temperatura;
    delay(25);
  }

if ( bouncor.read() == Low && kn_c==1) 
 {
  kn_c=0;
memoru0 = temperatura;//Заносим в память
 }
}

 

 

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

хз поможет или нет. но у меня на двух кнопках. у тебя соответственно на 3 и надо будет переделать

в лупе

//========================================================================
  //                         Управление первой кнопкой
  //========================================================================
  if(digitalRead(pin_1)==0 && digitalRead(pin_2)==1){
    delay(50);
    if(digitalRead(pin_1)==0 && digitalRead(pin_2)==1){
      test=0;
      switch (display_N) {
      case 0: // если главный экран
        display_N=2;
        Window_2(display_2_menu);
        delay(200);
        break;

      case 1: // если экран статистики
        display_N=0;
        Window_0();
        delay(200);
        break;

      case 2: // если меню настроек
        display_2_menu++;
        if(display_2_menu==5) display_2_menu=0;
        Window_2(display_2_menu);
        delay(200);
        break;

      case 3: // если экран калибровки
        display_3_menu++;
        if(display_3_menu==3) display_3_menu=0;
        Window_3(display_3_menu);
        delay(200);
        break;

      case 4: // если настройка масса
        display_4_menu++;
        if(display_4_menu==3) display_4_menu=0;
        Window_4(display_4_menu);
        delay(200);
        break;

      }
    }
  }

  //========================================================================
  //                         Управление второй кнопкой
  //========================================================================
  if(digitalRead(pin_2)==0 && digitalRead(pin_1)==1){
    delay(50);
    if(digitalRead(pin_2)==0 && digitalRead(pin_1)==1){
      test=0;
      switch (display_N) {
      case 0: 
        first(); 
        break; 
      case 1: 
        Stat();
        break;  
      case 2:
        Settints();
        break;
      case 3:
        Calibr();
        break;
      case 4:
        massa();
        break;
      }
    }
  }

нужно сделать несколько функций, отвечающих на каждый экран, плюс экран с выбором нужного экрана

вот например пару экранов

//========================================================================
//                            Главный экран
//========================================================================
void Window_0(){
  fillScreen(!color);
  vyvod(skorost);
  drawRect(S,  S, W, H, color);
  drawRect(S, 12, W, 44, color);
  drawFastVLine(48, 2, 11, color);
  drawFastVLine(48, 56, 11, color);

  drawBitmap(68,33, image, 24, 16, color);
  drawString(13, 57, color, "Меню");
  drawString(55, 57, color, "Данные");

  int_LCD(58, 3, middle);

  if(DATA[0]!=0){
    for(byte i=0;i<=n;i++){
      fillRect(5+i*4,  3,  3,  8, color);
    }
  }
  
  Update();
}

//========================================================================
//                            Экран статистики
//========================================================================
void Window_1(){
  fillScreen(!color);
  drawRect(S,  5,   W, 62, color);
  drawFastVLine(48, 5,  62, color);


  for(byte i=15;i<56;i+=10){
    drawFastHLine(S,  i, W, color);
  }
  for(byte i=0;i<10;i++){
    if((i==0||i==2||i==4||i==6||i==8)&& DATA[i]!=0){
      int_LCD(12,  7+i*5, DATA[i]);
    }
    if((i==1||i==3||i==5||i==7||i==9)&& DATA[i]!=0){
      int_LCD(58,  7+(i-1)*5, DATA[i]);
    }  
  }
  drawString(10, 57, color, "Назад");
  drawString(57, 57, color, "Сброс");
  Update();
}

а управляется просто. есть переменные, в которые записываются значения текущие на конкретном экране

byte display_N = 0;
byte display_2_menu = 0;
byte display_3_menu = 0;
byte display_4_menu = 0;
byte display_5_menu = 0;

плюс переменные которые изменяются в меню и текст например для меню, для экономии памяти. плюс можно хранить во флеше

byte calibration;
byte mass;
byte energi;
byte color;

char* myStrings[8]={ "Калибровка", "Масса", "Скорость", "Энергия", "Инверсия", "Назад",
  "+", "-"};

int DATA [10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Фига тут дядя наехал... он не знал про карандаш и бамагу.. а теперь у него душнвная травма и куча комплексов?
хочется обнять крепко и спросить шепотом:
- КАК ЖЕ ТЕБЕ ТЯЖКО ЖИВЕТСЯ С ТВОМИ КОМПЛЕКСАМИ.

Looka
Offline
Зарегистрирован: 24.04.2012

Bobrov.Anatoliy пишет:

Ну Вы видите, люди разные, конечно, неприятно, когда на тебя наезжают, казалось бы не хочешь помочь, не пиши ничего, пройди мимо, обидно, но с другой стороны, есть и такие как Вы, просто добрый совет или подскажут, что я не так пишу или спрашиваю, да даже тот, что флудит распальцовкой  Puhlyaviy, или Looka

А в каком месте я Вас задел или чем обидел?     
В чем флуд-то,  своим опытом аоделился?
В каком месте я на Вас наехал-то?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Looka пишет:

А в каком месте я Вас задел или чем обидел?     
В чем флуд-то,  своим опытом аоделился?
В каком месте я на Вас наехал-то?


привыкай.
Ты учишь их решать проблемы. А они научившись кидают в тебя какашками и уходят.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Когда какашки летят прицельно это еще пол-беды. Беда это когда их на вентилятор накидывают, стоя позади него во всем белом .

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013
Спасибо большое,
в вашем коде не могу никак перейти к кнопкам UP DOWN, алгоритм такой:
Кнопки у меня подключены с подтягивающими резисторами на пины ардуины:
#define BUTTONTEMP 7  //кнопка установки температуры
#define BUTTONTIME 6  //кнопка установки ВРЕМЕНИ
#define UP 5          //кнопка увеличения значения
#define DOWN 4        //кнопка уменьшения значения
Индикатор семисегментный, трехразрядный, алгоритм печати у меня выглядит так:
 дняя панель блока выглядит так:

а сама плата сейчас с установленной наной и MAX7219 так:

LOOKA подсказал мудрую вещь:ну и еще по Вашему вопросу.   Быть может проще будет реализовать такой алгоритм,   параметр меняется при нажатии соответствующей кнопки,  удерживаете кнопку температура и  нжимаете UP или Down - соответственно меняется температура.  удерживаете кнопку время - меняете параметр время.    А в память заносите когда отпускаете соответсвующую кнопку. 

Блок схему составил по этому алгоритму, вот только с привязкой к ней операторов сложно, подскажите комментарии мои верны?:

bool kn_c=0;// создаем булевую переменную

void loop()
{

if ( bouncer1.update() )//проверяем состояние кнопки TEMP
{
 if ( bouncer1.read() == LOW && kn_c==0) //Если она нажата, то 
 {
  kn_c=1;//здесь должна быть проверка кнопки UP, как ее выполнить?:
         //bouncer3.update(), потом считать ее значение и присвоить ей имя kn_up :
         //if ( bouncer1.read() == LOW && kn_c==kn_up)
 }

if (kn_c)//здесь проверка кнопки DOWN?
 //bouncer4.update(), потом считать ее значение и присвоить ей имя kn_DOWN :
         //if ( bouncer4.read() == LOW && kn_c==kn_down)
{
  if (kn_up=1)//если кнопка UP нажата, увеличиваем значение температуры и печатаем его
  {
    setTmp++;
    delay(25);
     T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100); 
  }
if (kn_down=1)//если кнопка DOWN нажата, уменьшаем значение температуры и печатаем его
  {
   setTmp --;
    delay(25);
    T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
  }

if ( bouncer1.read() == LOW && kn_c==1) //если кнопка TEMP(установки температуры) отпущена
 {
  kn_c=0;
EEPROM_write(0, setTmp);//Заносим в память значение установленной температуры и печатаем его
 T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
 }
}

Как вы понимаете, у меня не стыкуется переход к кнопкам UP и DOWN и еще, правильно ли идет печать или ее делать в большом цикле?

вот общий код со вставкой кода выбора меню:

// Версия 1.4 31.07.15 работает термометр и две кнопки - включения и подсветки
// настраиваем кнопки установки температуры, вводим утановленную температуру
// проверяем условие включения нагревателей
// проект управления печкой сауны, Arduino Nano, 7сегментный трехразрядный дисплей,
// драйвер дисплея MAX7219, шесть кнопок управления, датчик температуры Dallas

#include <LedControl.h>//Подключаем библиотеку для работы с дисплеем
#include <OneWire.h>// Подключаем библиотеку для работы с шиной OneWire
#include <Bounce.h>;//подключаем библиотеку Bounce
#include <EEPROM2.h>// Подключаем библиотеку для работы с ARDUINO EEPROM
#include <DallasTemperature.h>//Подключаем библиотеку для работы с термометром
OneWire oneWire(3);// Термометр будет подключен на Pin3
LedControl lc=LedControl(12,11,10,1);// присваиваем адрес дисплею

#define ONE_WIRE_BUS 3
// разбираемся с кнопками:
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON1 9     // кнопка выключения
#define OFF 18        //выход выключателя
#define BUTTON 8      //кнопка подсветки
#define LED 19        //выход подсветки
#define BUTTONTEMP 7  //кнопка установки температуры
#define BUTTONTIME 6  //кнопка установки ВРЕМЕНИ
#define UP 5          //кнопка увеличения значения
#define DOWN 4        //кнопка уменьшения значения
#define OUTHET1 16    //выход нагревателя 1
#define OUTHET2 17    //выход нагревателя 2

//==================================================================================================
//обозначаем кнопки меню
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncor = Bounce(BUTTON1,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(BUTTONTEMP,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer2 = Bounce(BUTTONTIME,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer3 = Bounce(UP,2); 
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer4 = Bounce(DOWN,2); 
//===================================================================================================

//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;
//задаем начальное состояние прибора
int OFFValue = LOW;
//Обьявляем состояние выходов нагревателей
boolean outhet1Status=LOW;
boolean outhet2Status=LOW;
//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры
bool kn_c=0;// создаем булевую переменную
bool kn_down=0;// создаем булевую переменную
bool kn_up=0;// создаем булевую переменную
//=================================================================****

DallasTemperature sensors(&oneWire);
//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
float temp1=0;        //переменная для хранения температуры
int T1;         // переменная текущей температуры
int setTmp=0;   // переменная для заданного значения температуры
int ones;         //переменная для печати
int tens;         //переменная для печати
int hundreds;     //переменная для печати
//переменные для задания температуры в меню
int regim=1; 
 int flag=0; 

//================================================================*****

void setup() {
 //определяем режимы работы пинов
      pinMode(BUTTON,INPUT);
  pinMode(LED,OUTPUT);
      pinMode(BUTTON1,INPUT);
  pinMode(OFF,OUTPUT);
  pinMode(OUTHET1,OUTPUT);
  digitalWrite(OUTHET1,LOW);
  pinMode(OUTHET2,OUTPUT);
  digitalWrite(OUTHET2,LOW);
      pinMode(BUTTONTEMP,INPUT);
      pinMode(BUTTONTEMP,INPUT); 
      pinMode(UP,INPUT);
      pinMode(DOWN,INPUT);
//Считаем из постоянной памяти заданную температуру
//Заданная температура будет храниться по адресу 0
  setTmp=EEPROM_read_byte(0);
//зададим исходные параметры для дисплея
lc.clearDisplay(0);// clear screen
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,7);// sets brightness (0~15 possible values)
lc.setScanLimit(1, 3);
//Инициализируем термодатчик и установим разрешающую способность 12 бит
sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(12);
 T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (3000); 
lc.clearDisplay(0);// clear screen
}

//=====================================================================*************

void loop(void){
{
  //Включаем прибор
  //если сменилось состояние кнопки On/Off
  if ( bouncor.update() ) 
  {
    //если считано значение 1
    if ( bouncor.read() == HIGH) {
        //если свет был выключен, будем его включать
        if ( OFFValue == LOW ) {
        OFFValue = HIGH;
        //если свет был включен, будем выключать
     } 
     else {
       OFFValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(OFF,OFFValue);
    }
  }
//=========================================================
// включаем подсветку  
{
  //если сменилось состояние кнопки Light
  if ( bouncer.update() ) {
      //если считано значение 1
      if ( bouncer.read() == HIGH) {
        //если свет был выключен, будем его включать
        if ( ledValue == LOW ) {
       ledValue = HIGH;
     //если свет был включен, будем выключать
     } else {
       ledValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(LED,ledValue);
    }
  }
}
//==========================================================
//Задаем температуру


if ( bouncer1.update() )//проверяем состояние кнопки TEMP
{
 if ( bouncer1.read() == LOW && kn_c==0) //Если она нажата, то 
 {
  kn_c=1;//здесь должна быть проверка кнопки UP, как ее выполнить?:
         //bouncer3.update(), потом считать ее значение и присвоить ей имя kn_up :
         //if ( bouncer1.read() == LOW && kn_c==kn_up)
 }

if (kn_c)//здесь проверка кнопки DOWN?
 //bouncer4.update(), потом считать ее значение и присвоить ей имя kn_DOWN :
         //if ( bouncer4.read() == LOW && kn_c==kn_down)
}

{
  if (kn_up=1)//если кнопка UP нажата, увеличиваем значение температуры и печатаем его
  {
    setTmp++;
    delay(25);
     T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100); 
  }
if (kn_down=1)//если кнопка DOWN нажата, уменьшаем значение температуры и печатаем его
  {
   setTmp --;
    delay(25);
    T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
  }

if ( bouncer1.read() == LOW && kn_c==1) //если кнопка TEMP(установки температуры) отпущена
 {
  kn_c=0;
EEPROM_write(0, setTmp);//Заносим в память значение установленной температуры и печатаем его
 T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
 }
}



//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
      unsigned long currentMillis1 = millis();
      if(currentMillis1 - previousMillis1 > interval1) {
      previousMillis1 = currentMillis1;  
//Запуск процедуры измерения температуры
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);
//Считывание значения температуры
      sensors.getAddress(tempDeviceAddress, 0);
      temp1=sensors.getTempC(tempDeviceAddress);
  T1= temp1*10;//И печатаем его
  hundreds = T1/100;
  tens=(T1-hundreds*100)/10;
  ones=T1-(hundreds*100+tens*10);
  lc.setDigit(0,0,hundreds,false);
  lc.setDigit(0,1,tens,true); 
  lc.setDigit(0,2,ones,false);
}
//Проверка условия включения/выключения нагревателей:
if (temp1<setTmp&&outhet1Status==LOW){outhet1Status=HIGH; digitalWrite(OUTHET1,HIGH);}
if (temp1>setTmp&&outhet1Status==HIGH){outhet1Status=LOW; digitalWrite(OUTHET1,LOW);}
if (temp1<setTmp&&outhet2Status==LOW){outhet2Status=HIGH; digitalWrite(OUTHET2,HIGH);}
if (temp1>setTmp&&outhet2Status==HIGH){outhet2Status=LOW; digitalWrite(OUTHET2,LOW);} 
   }
//Конец кода

Заранее спасибо!!!!

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

по первой кнопке у меня приблизительно так. но там не все. лень было рисовать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Дык вон же универсальную штуку написал 999й про кнопочки в соседней ветке. Ток вставляй и радуйся.

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

ЖЕКА, я такое меню делал на двухстрочном LCD, тут дело другое, сам видишь, трехразрядный семисегментник и три кнопки, выбор режима и UP DOWN, там через ISP интерфейс и шилд с кнопками прикручен к экрану, кода на эту тему море, а вот то что мне надо есть в примерах а вживом проекте нет, а сам я не допру никак как вставить кнопки в пример:

{

if ( bouncor.update() )
{
 if ( bouncor.read() == Low && kn_c==0) 
 {
  kn_c=1;
 }

if (kn_c)
{
  if (kn_up)
  {
    ++temperatura;
    delay(25);
  }
if (kn_down)
  {
    --temperatura;
    delay(25);
  }

if ( bouncor.read() == Low && kn_c==1) 
 {
  kn_c=0;
memoru0 = temperatura;//Заносим в память
 }
}

Пыжусь, прописываю, но косяк на косяке:

//Задаем температуру


if ( bouncer1.update() )//проверяем состояние кнопки TEMP
{
 if ( bouncer1.read() == LOW && kn_c==0) //Если она нажата, то 
 {
  kn_c=1;//здесь должна быть проверка кнопки UP, как ее выполнить?:
         //bouncer3.update(), потом считать ее значение и присвоить ей имя kn_up :
         //if ( bouncer1.read() == LOW && kn_c==kn_up)
 }

//if (kn_c)//здесь проверка кнопки DOWN?
if ( bouncer4.update() )// потом считать ее значение и присвоить ей имя kn_DOWN :
{
  if ( bouncer4.read() == LOW && kn_c==kn_down)
         {
          kn_down=1;
          };
{
  if (kn_up=1)//если кнопка UP нажата, увеличиваем значение температуры и печатаем его
  {
    setTmp++;
    delay(25);
     T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100); 
  }
}
if (kn_down=1)//если кнопка DOWN нажата, уменьшаем значение температуры и печатаем его
  {
   setTmp --;
    delay(25);
    T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
  }

if ( bouncer1.read() == LOW && kn_c==1) //если кнопка TEMP(установки температуры) отпущена
 {
  kn_c=0;
EEPROM_write(0, setTmp);//Заносим в память значение установленной температуры и печатаем его
 T1 = setTmp*10;                    //в этом блоке печатаем установленную температуру
 hundreds = T1/100;
 tens=(T1-hundreds*100)/10;
 ones=T1-(hundreds*100+tens*10);
 lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); 
lc.setDigit(0,2,ones,false); 
delay (100);  
 }
}
}

не понимаю, как после проверки кнопки установки температуры вызвать кнопку UP, да чтобы она еще и прибавила мне температуру. А с семисегментником вообще код разрастается, попробую его печать в библиотечку засунуть.

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

какая разница какой дисплей если ты принцип уже знаешь

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Жека, скажу иными словами, твой код меню слишком крут для моей печки, мне надо тремя кнопками выставить температуру и все. Кроме того, весьма проблематично индицировать пункты меню на семисегментнике, согласись, чтобы написать на трехэлементном семисегментнике "МЕНЮ" или "ДАННЫЕ" надо извернуться..., но за пример кода спасибо, конструкция изящная, и компактно решает проблему.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

какая разница какой дисплей если ты принцип уже знаешь


Знать и понимать это разные вещи.

3 знака.
Первый можно использовать для обозначения что за переменная, оставшиеся 2 для температуры.
Жмакаем кнопку режим она меняет переменную например TYPE по кругу
Типа
1 нижняя температура
2 верхняя температура
3 время
4....
Дальше вообще просто каждый раз обнаружив нажатие up/down проверяем переменную режим и увеличиваем или уменьшаем связаную с этим режимом переменную.
А дисплей вообще отображаем проверяя чему там TYPE щас равна.

Честно говоря утомили уже своими соплями.

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

а чего семисегментный? возьми 1602. намного себе упростишь жизнь

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

а чего семисегментный? возьми 1602. намного себе упростишь жизнь


Ты изыскано издеваешься? Проблема с 3 кнопками меню сделать. Хотя проще только меню с 2 кнопками. А там вообще труба будет.
Сбежал он. Как обычно. Получил ответ и тихо смылся

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

хорош прикалываться, я же сказал изначально такая задача: заменить PIC ушку на плате управления печкой сауны, чтобы не менять дизайн панели управления:

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Пухлый, сгинь, иди паркет свой "ручной работы" натирай!

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
Ты изыскано издеваешься? Проблема с 3 кнопками меню сделать. Хотя проще только меню с 2 кнопками. А там вообще труба будет. Сбежал он. Как обычно. Получил ответ и тихо смылся

у меня в черновике остался вариант с обработкой кликов более двух раз - нужно наказать новичков многокликовым однокнопочным меню.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Bobrov.Anatoliy пишет:

Пухлый, сгинь, иди паркет свой "ручной работы" натирай!


Гыыы тоесть предложеный выше алгоритм в пяток строк слишком прост? Вас теперь смущает его очевидность? Или то что сами не смогли до него додуматься?

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

я не вижу никакого дисплея, если конечно он через красную полоску не просвечивает

разделять просто, уставнока температуры через значок градусы, и т.д.

а что настраивается вообще?

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Во! научился картинки вставлять, схема устройства в протеусе:

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

у меня в черновике остался вариант с обработкой кликов более двух раз - нужно наказать новичков многокликовым однокнопочным меню.


да на твоем скече однокнопочное меню реализуется за 2 минуты.
Долго держишь меняется режим.
Короткие нажатия увеличивают температуру по кругу.

Bobrov.Anatoliy
Offline
Зарегистрирован: 29.08.2013

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
да на твоем скече однокнопочное меню реализуется за 2 минуты. Долго держишь меняется режим. Короткие нажатия увеличивают температуру по кругу.

нет - навичок должен страдать, поэтому не менее пятикликовое управление должно быть

про "долго держишь" не совсем ясно - у меня честная кнопка: одно событие - один такт.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

нет - навичок должен страдать, поэтому не менее пятикликовое управление должно быть


да он уже утомил нытьем. Я ему вон выше расписал как в пяток строк его меню сделать из 3 кнопок. Но он делает вид что не заметил.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
Но он делает вид что не заметил.

патамушта ты пратииивный!

даблкликом удобнее режимы переключать.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

патамушта ты пратииивный!

даблкликом удобнее режимы переключать.


это все потому что рано с больничного вышел. Нуна еще пару недель побалдеть.