переключение режимов кнопки
- Войдите на сайт для отправки комментариев
Ср, 26/07/2017 - 12:51
#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);
}
}
#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); } } }В первом посте код при котором всё нормально работает, но там нет кнопки для переключения режимов. Смысл в том, чтобы на кнопку переключать режимы нагревательного элемента через реле, но режимы не переключаются - не пойму почему. По идее тут всё верно написано и соединение правильное, но при нажатии кнопки ничего не происходит
ноты, нагревательный элемент... ТС, ты йобнулся?
добавил в каждый режим еще serial print, выходит такая штука:
помогите
помогите
у тебя там волшебная кнопка есть "поиск в Хуйяндексе и на компьютере" - нажми ея и не заёбуй больше.
добавил в каждый режим еще serial print, выходит такая штука:
1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.
2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.
3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.
у меня задумка чтобы с помощью нажатия на кнопку выбиралось по очереди один из трёх режимов для включения и отключения нагревательного элемента. Температура приходит с пирометра, скетч полностью во втором посте. Первый скетч это когда есть один режим и там всё прекрасно работает, но там нет кнопки - там просто датчик понимает какая температура сейчас и выключает или включает с помощью реле нагревательный элемент.
добавил в каждый режим еще serial print, выходит такая штука:
1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.
2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.
3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.
ниже всё описал
BepwyTa, ответ банален. Не взлетит потому что ... нет, не гладиолус, а delay().
добавил в каждый режим еще serial print, выходит такая штука:
1. текстом выложить никак? Эту картинку сами разглядывайте, мне не по глазам.
2. если уж "добавил", так давайте скетч. Откуда нам знать что и куда Вы там добавили.
3. Потрудитесь внятно объяснить проблему. Ваши выражение "режимы кнопки" и "на кнопку переключать режимы нагревательного элемента через реле" понятны только Вам.
а на счёт картинки - вот вырезал часть картинки
BepwyTa, ответ банален. Не взлетит потому что ... нет, не гладиолус, а delay().
а что с делеем? его не должно быть?
2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?
2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?
так там же и, должны оба соблюдаться?!
2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?
просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов
2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?
просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов
и хотя Вы не ответили на вопрос, посмотрите в сторону switch case
2TC: regim=1 и TempC=38 . Вопрос: какой else if отработает?
просто иначе не понимаю как сделать, чтобы был сначала один иф - выбор режима, а потом следом за ним другой иф - в этом режиме значения температуры или > 40 градусов или < 40 градусов
и хотя Вы не ответили на вопрос, посмотрите в сторону switch case
попробую сейчас, спасибо
а что с делеем? его не должно быть?
пока вы применяете delay() программа будет клинить.
а что с делеем? его не должно быть?
пока вы применяете delay() программа будет клинить.
но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?
ладно. жуй кактус дальше. Надоест поищи как используется millis()
но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?
Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?
но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?
Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?
Спасибо, увеличу до секунды
но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?
Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?
Спасибо, увеличу до секунды
забрал в тупизмы.
Слышишь у*бан, ты троль тут местный?
да. и я не уйду. #43
Спасибо, увеличу до секунды
вы идиот или как? :)
но у меня же есть делей после каждого else if, он нужен еще и после обычного иф в каждом режиме?
Задайте себе вопрос и попытайтесь честно на него ответить: что будет если кнопку нажмут вначале Вашего delay(500), и успеют отпустить до его (delay'я) окончания? Там ведь целых полсекунды - можно и не раз успеть кнопку нажать-отпустить. Обработается нажатие кнопки или будет проигнорировано? Как Вы думаете?
Спасибо, увеличу до секунды
Та немає за що!