ARDUINO Нужна помощь. Код для уведомления о превышении заданной температуры.

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
Здравствуйте. Подскажите, пожалуйста, как правильно сделать код.

Я считываю с датчика температуру, и хочу чтобы после превышения 30 градусов буззер три раза пропищал.
Код работает и выглядит так(void setup и инклуды не в счет):

if (temperature > 30) {
digitalWrite(buzzPin, LOW);
delay(100);
digitalWrite(buzzPin, HIGH);
delay(100);
}

if (temperature < 30) {
digitalWrite(buzzPin, HIGH);
}

Вопрос заключается в том, как сделать так, чтобы при превышении 30 градусов буззер пропищал 3 раза и выключился? С данным кодом он работает постоянно пока температура выше 30 градусов. А хочется чтобы после превышения 30 градусов он 3 раза пропищал и остановился, пусть даже если температура выше 30, а затем, когда температура упадет ниже 30 и заново поднимется до 30, код вновь сработал и буззер 3 раза пропищал.
 
  • Лойс +1
Реакции: Digiprog-Master

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
Ну и введи переменную Пищал-ли-бузер. И пищи только если не пищал. И сбрасывай её после снижения температуры
Подскажите, пожалуйста, как это оформить в коде. Я еще не сильно разбираюсь, недавно только познакомился с ардуинкой.
 
  • Лойс +1
Реакции: Digiprog-Master

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Тут дело не в ардуинке, а в программировании, раздел выбран правильно.
Пример.
Тактовая кнопка имеет 2 состояния: нажата и отпущена. Можно написать такой (псевдо)код
C++:
если кнопка нажата, то зажечь светодиод
если кнопка не нажата, то погасить светодиод.
Работать будет, но почти при каждом цикле будет либо включаться включенный светодиод либо выключаться выключенный. И лишь иногда будет смена состояния. Для таких целей вводят доп. переменную и получают такой код
C++:
сетап
светодиод=выключен

цикл
если кнопка нажата и светодиод выключен то зажечь светодиод и светодиод=включен
если кнопка не нажата и светодиод включен, то погасить светодиод и светодиод=выключен

чо то много нацарапал по простому вопросу...
 
  • Лойс +1
Реакции: Digiprog-Master и vortexRC

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
Тут дело не в ардуинке, а в программировании, раздел выбран правильно.
Пример.
Тактовая кнопка имеет 2 состояния: нажата и отпущена. Можно написать такой (псевдо)код
C++:
если кнопка нажата, то зажечь светодиод
если кнопка не нажата, то погасить светодиод.
Работать будет, но почти при каждом цикле будет либо включаться включенный светодиод либо выключаться выключенный. И лишь иногда будет смена состояния. Для таких целей вводят доп. переменную и получают такой код
C++:
сетап
светодиод=выключен

цикл
если кнопка нажата и светодиод выключен то зажечь светодиод и светодиод=включен
если кнопка не нажата и светодиод включен, то погасить светодиод и светодиод=выключен

чо то много нацарапал по простому вопросу...
Спасибо. Это так называемый способ флажка? Попробую сделать, потом скину сюда результат
 
  • Лойс +1
Реакции: Digiprog-Master

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
Это победа! Работает, как нужно.
void loop() {
float temperature; // переменная для хранения температуры
sensor.requestTemperatures(); // отправляем запрос на измерение температуры
temperature = sensor.getTempCByIndex(0); // считываем данные из регистра датчика
Serial.println (temperature);

if (temperature > 30 && temp_flag == 0){
temp_flag = 1;
Serial.println("Temp podnyalas");
buzz_flag = !buzz_flag;

for (int i = 0; i < 15; i++) {
digitalWrite(buzzPin, LOW);
delay(140);
digitalWrite(buzzPin, HIGH);
delay(140);
}
}


if (temperature < 30 && temp_flag == 1 || temp_flag == 0) {
temp_flag = 0;
analogWrite(11, 0);
digitalWrite(buzzPin, HIGH);
Serial.println("Temp opustilas");
}

if (temperature > 30) {
analogWrite(11, 150);
delay(150);
analogWrite(11, 0);
delay(150);
}
else {
analogWrite(11, 0);
}
}

Описание: Когда датчик чувствует температуру выше 30 градусов, 15 раз пищит буззер, затем начинает мигать светодиод до тех пор, пока температура не упадет ниже 30. После того как t опять возрастёт, цикл начнется заново.
 
  • Лойс +1
Реакции: Digiprog-Master

dimonSha

✩✩✩✩✩✩✩
25 Окт 2019
64
9
Украина, Харьков.
Это победа! Работает, как нужно.
void loop() {
float temperature; // переменная для хранения температуры
sensor.requestTemperatures(); // отправляем запрос на измерение температуры
temperature = sensor.getTempCByIndex(0); // считываем данные из регистра датчика
Serial.println (temperature);

if (temperature > 30 && temp_flag == 0){
temp_flag = 1;
Serial.println("Temp podnyalas");
buzz_flag = !buzz_flag;

for (int i = 0; i < 15; i++) {
digitalWrite(buzzPin, LOW);
delay(140);
digitalWrite(buzzPin, HIGH);
delay(140);
}
}


if (temperature < 30 && temp_flag == 1 || temp_flag == 0) {
temp_flag = 0;
analogWrite(11, 0);
digitalWrite(buzzPin, HIGH);
Serial.println("Temp opustilas");
}

if (temperature > 30) {
analogWrite(11, 150);
delay(150);
analogWrite(11, 0);
delay(150);
}
else {
analogWrite(11, 0);
}
}

Описание: Когда датчик чувствует температуру выше 30 градусов, 15 раз пищит буззер, затем начинает мигать светодиод до тех пор, пока температура не упадет ниже 30. После того как t опять возрастёт, цикл начнется заново.
А счетчик не проще было прикрутить?
 
  • Лойс +1
Реакции: Digiprog-Master

dimonSha

✩✩✩✩✩✩✩
25 Окт 2019
64
9
Украина, Харьков.
Расскажите подробнее, не умею так делать
Как вариант

byte tims = 0; // счетчик


if(temperature > 30 && tims < 3 ){
tims++;
analogWrite(11, 150);
delay(150);
analogWrite(11, 0);
delay(150);
}

if(temp < 30 && count >= 3) count = 0;

что то типа такого можно.
 
  • Лойс +1
Реакции: Digiprog-Master и vortexRC