переключение режимов кнопки

BepwyTa
Offline
Зарегистрирован: 04.04.2017

#include "notes.h"
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int TempC;// температура
//  светодиоды - зелёный на 9 пин, красный на 8
const byte Green_pin = 9;
const byte Red_pin = 8;
int nRelayDrive = 12;
// ноты мелодии:
int melody[] = {
  LA4, DO5, SI4, LA4,
  0, FA4, SO4, LA4, SO4, FA4,
  MI4, MI4, RE4, MI4,
  0, RE4, MI4, FA4, MI4, RE4,
  LA4, MI4, RE4, DO4,
  0, SI3, DO4, RE4, MI4, DO4,
  SI3, LA3, 0     
};

// длительность нот: 4 = 1/4 ноты, 8 = 1/8 ноты, итд.
// элементы для удобства и наглядности разделим на такты
int noteDurations[] = {
  4, 8, 8, 2,
  4, 8, 8, 4, 8, 8,
  4, 8, 8, 2,
  4, 8, 8, 4, 8, 8,
  4, 8, 8, 2,
  4, 8, 8, 8, 4, 8,
  8, 1, 8
};

// количество элементов в массиве нот
int arrayCount = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
  arrayCount = sizeof(melody)/sizeof(int);
  pinMode(nRelayDrive, OUTPUT); // объявляем реле в качестве выхода
  digitalWrite(nRelayDrive, HIGH); // отключаем реле
}

void playMelody() {
  for (int iNote = 0; iNote < arrayCount; iNote++) {

    // для расчёта реальной длительности делим одну секунду на нашу условную длительность
    int noteDuration = 1400 / noteDurations[iNote];
    tone(4, melody[iNote], noteDuration);

    // устанавливаем минимальную паузу между нотами
    // длительность ноты + 30% работает отлично
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // останавливаем проигрывание:
    noTone(4);
  }
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  TempC = mlx.readObjectTempC();
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  if (TempC > 40) {
    digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    digitalWrite(nRelayDrive, HIGH); // отлючаем реле
     playMelody();
  }
  else if (TempC <40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
   digitalWrite(nRelayDrive, LOW); // включаем реле
    delay(500);
  }
   }

 

BepwyTa
Offline
Зарегистрирован: 04.04.2017

#include "notes.h"
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int TempC;// температура
//  светодиоды - зелёный на 9 пин, красный на 8
const byte Green_pin = 9;
const byte Red_pin = 8;
int nRelayDrive = 12;
int First_LedPin = 5; // Подключаем красный светодиод к порту 5
int Two_LedPin = 6; // Подключаем зеленый светодиод к порту 6
int Three_LedPin = 7; // Подключаем синий светодиод к порту 7
int ButPin = 11; // Подключаем кнопку к выходу 11
int flag = 0; // флаг состояния
int regim = 0; // Переключалка
// ноты мелодии:
int melody[] = {
  LA4, DO5, SI4, LA4,
  0, FA4, SO4, LA4, SO4, FA4,
  MI4, MI4, RE4, MI4,
  0, RE4, MI4, FA4, MI4, RE4,
  LA4, MI4, RE4, DO4,
  0, SI3, DO4, RE4, MI4, DO4,
  SI3, LA3, 0     
};

// длительность нот: 4 = 1/4 ноты, 8 = 1/8 ноты, итд.
// элементы для удобства и наглядности разделим на такты
int noteDurations[] = {
  4, 8, 8, 2,
  4, 8, 8, 4, 8, 8,
  4, 8, 8, 2,
  4, 8, 8, 4, 8, 8,
  4, 8, 8, 2,
  4, 8, 8, 8, 4, 8,
  8, 1, 8
};

// количество элементов в массиве нот
int arrayCount = 0;

void setup() {

  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
  pinMode(First_LedPin, OUTPUT); 
pinMode(Two_LedPin, OUTPUT); 
pinMode(Three_LedPin, OUTPUT); 
  arrayCount = sizeof(melody)/sizeof(int);
  pinMode(nRelayDrive, OUTPUT); // объявляем реле в качестве выхода
  digitalWrite(nRelayDrive, HIGH); // отключаем реле
}

void playMelody() {
  for (int iNote = 0; iNote < arrayCount; iNote++) {

    // для расчёта реальной длительности делим одну секунду на нашу условную длительность
    int noteDuration = 1400 / noteDurations[iNote];
    tone(4, melody[iNote], noteDuration);

    // устанавливаем минимальную паузу между нотами
    // длительность ноты + 30% работает отлично
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // останавливаем проигрывание:
    noTone(4);
  }
}

void loop() {
   Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  TempC = mlx.readObjectTempC();
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  {
if(digitalRead(ButPin) == HIGH && flag == 0) 
{ 
regim ++;
flag = 1;

if(regim > 3) // Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 0;
}
}

if(digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}

// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 0: OFF
if(regim == 0)
{
digitalWrite(First_LedPin, LOW);
digitalWrite(Two_LedPin, LOW);
digitalWrite(Three_LedPin, LOW); 
Serial.print("Rezhim 0");
}
// РЕЖИМ 1: First 
if((regim == 1) && (TempC > 37))
{
digitalWrite(First_LedPin, HIGH);
digitalWrite(Two_LedPin, LOW);
digitalWrite(Three_LedPin, LOW); 
digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    digitalWrite(nRelayDrive, HIGH); // отлючаем реле
    Serial.print("Rezhim 1");
     playMelody();
}
 else if (TempC < 37) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
   digitalWrite(nRelayDrive, LOW); // включаем реле
    delay(500);
  }
// РЕЖИМ 2: Two
if((regim == 2) && (TempC > 40))
{
digitalWrite(First_LedPin, LOW);
digitalWrite(Two_LedPin, HIGH);
digitalWrite(Three_LedPin, LOW); 
digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    digitalWrite(nRelayDrive, HIGH); // отлючаем реле
    Serial.print("Rezhim 2");
     playMelody();
}
 else if (TempC < 40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
   digitalWrite(nRelayDrive, LOW); // включаем реле
    delay(500);
  }
// РЕЖИМ 3: Three
   if((regim == 3) && (TempC > 50))
{
digitalWrite(First_LedPin, LOW);
digitalWrite(Two_LedPin, LOW);
digitalWrite(Three_LedPin, HIGH); 
digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    digitalWrite(nRelayDrive, HIGH); // отлючаем реле
    Serial.print("Rezhim 3");
     playMelody();
}
 else if (TempC < 50) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
   digitalWrite(nRelayDrive, LOW); // включаем реле
    delay(500);
  }
    }
}

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

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

ноты, нагревательный элемент... ТС, ты йобнулся?

BepwyTa
Offline
Зарегистрирован: 04.04.2017

добавил в каждый режим еще serial print, выходит такая штука:  

BepwyTa
Offline
Зарегистрирован: 04.04.2017

помогите

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

BepwyTa пишет:

помогите

у тебя там волшебная кнопка есть "поиск в Хуйяндексе и на компьютере" - нажми ея и не заёбуй больше.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BepwyTa пишет:

добавил в каждый режим еще serial print, выходит такая штука:  

1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.

2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.

3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.

BepwyTa
Offline
Зарегистрирован: 04.04.2017

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

BepwyTa
Offline
Зарегистрирован: 04.04.2017

ЕвгенийП пишет:

BepwyTa пишет:

добавил в каждый режим еще serial print, выходит такая штука:  

1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.

2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.

3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.

ниже всё описал

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

BepwyTa, ответ банален. Не взлетит потому что ... нет, не гладиолус, а delay().

BepwyTa
Offline
Зарегистрирован: 04.04.2017

ЕвгенийП пишет:

BepwyTa пишет:

добавил в каждый режим еще serial print, выходит такая штука:  

1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.

2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.

3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.

а на счёт картинки - вот вырезал часть картинки

BepwyTa
Offline
Зарегистрирован: 04.04.2017

qwone пишет:

BepwyTa, ответ банален. Не взлетит потому что ... нет, не гладиолус, а delay().

а что с делеем? его не должно быть?

T.Rook
Offline
Зарегистрирован: 05.03.2016

2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?

BepwyTa
Offline
Зарегистрирован: 04.04.2017

T.Rook пишет:

2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?

так там же и, должны оба соблюдаться?!

BepwyTa
Offline
Зарегистрирован: 04.04.2017

T.Rook пишет:

2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?

просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов

T.Rook
Offline
Зарегистрирован: 05.03.2016

BepwyTa пишет:

T.Rook пишет:

2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?

просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов

и хотя Вы не ответили на вопрос, посмотрите в сторону switch case

BepwyTa
Offline
Зарегистрирован: 04.04.2017

T.Rook пишет:

BepwyTa пишет:

T.Rook пишет:

2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?

просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов

и хотя Вы не ответили на вопрос, посмотрите в сторону switch case

попробую сейчас, спасибо

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

BepwyTa пишет:

а что с делеем? его не должно быть?

пока вы применяете delay() программа будет клинить.

BepwyTa
Offline
Зарегистрирован: 04.04.2017

qwone пишет:

BepwyTa пишет:

а что с делеем? его не должно быть?

пока вы применяете delay() программа будет клинить.

но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ладно. жуй кактус дальше. Надоест поищи как используется millis()

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BepwyTa пишет:

но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?

Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?

BepwyTa
Offline
Зарегистрирован: 04.04.2017

ЕвгенийП пишет:

BepwyTa пишет:

но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?

Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?

Спасибо, увеличу до секунды

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

BepwyTa пишет:

ЕвгенийП пишет:

BepwyTa пишет:

но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?

Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?

Спасибо, увеличу до секунды

забрал в тупизмы.

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

BepwyTa пишет:

Слышишь у*бан, ты троль тут местный? 

да. и я не уйду. #43

b707
Offline
Зарегистрирован: 26.05.2017

BepwyTa пишет:

Спасибо, увеличу до секунды

вы идиот или как? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BepwyTa пишет:

ЕвгенийП пишет:

BepwyTa пишет:

но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?

Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?

Спасибо, увеличу до секунды

Та немає за що!