Бузер как сделать?

konog
Offline
Зарегистрирован: 17.12.2015

Добрый вечер всем. Имееться термометр в машину. Подскажите как сделать чтоб бузер пикал к примеру 3 раза при какойто температуры и так же при включении устройства если температура ниже заданой температуры тоже было извещение.

Другими словами как в иномарках при температуре +2 идет предупреждение о гололеде, а так же если включаем зажигание и температура <=2 градусам идет так же предупреждение

Если нужно то выложу свой скетч сюда. Заранее благодарен

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

konog пишет:

Если нужно то выложу свой скетч сюда. Заранее благодарен

Дык, выкладывайте. И скетч и схему. Чего так-то обсуждать? Мы даже не знаем, что там за буззер у Вас.

konog
Offline
Зарегистрирован: 17.12.2015
#include <OneWire.h>
#include <DallasTemperature.h>
#include <OLED_I2C.h>

OLED myOLED(SDA, SCL, 8);

#define ONE_WIRE_BUS 4            // DS18B20 подключен  сюда
#define TEMPERATURE_PRECISION 11  // точность измерения температуры
#define R1 1000                   // резисторы измерения напряжения 1 МОм
#define R2 67                     // резисторы измерения напряжения 67 КОм
#define averageFactor 4           // коэффициент сглаживания показаний (0 = не сглаживать)

extern uint8_t MegaNumbers[];
extern uint8_t SmallFont[];
extern uint8_t sun[];
extern uint8_t winter[];

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;      // Получили адресс датчика температуры

//String tmpStr;
String msg_a;
String msg_t;
float tempC = 0;
int analogPin = 0;
int light = 0;
unsigned long previousMillis = 0;     // время последнего измерения
const long interval = 500;            // интервал для измерения температуры (milliseconds)
unsigned long previousSec = 0;        // время последнего показа
const long intervalMsg = 1000;        // интервал показа сообщения о погоде
int msgState = LOW;                   // тип сообщения

void setup()
{
  myOLED.begin();
  myOLED.clrScr();
  myOLED.update();
 
  msg_a = "";
  msg_t = "";
  analogReference(INTERNAL);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(TEMPERATURE_PRECISION);
  myOLED.invert (false);
}
void loop(void)
{
  myOLED.clrScr();
  // Делаем инверсию в зависимости от подсветки ============================================================
  light = analogRead(analogPin); //Устанавливаем подсветку равную напряжению на аналогом входе
  if (light > 50) //Считывание подсветки
  {
    myOLED.invert (true);//Подсветка день
  }
  else
  {
    myOLED.invert (false);//Подсветка ночь

  }

  unsigned long currentMillis = millis();
  // раз в интервал считывает температуру ================================================================
  if (currentMillis - previousMillis >= interval) {
    // save the last time
    previousMillis = currentMillis;

    // узнаём температуру
    sensors.setWaitForConversion(false);  // makes it async
    sensors.requestTemperatures();
    sensors.setWaitForConversion(true);
    delay(500); //Задержка опроса датчика
    tempC = sensors.getTempCByIndex(0);

    //tempC = -1.1; // отладка
  }

  myOLED.setFont(SmallFont);
  if (tempC >= 0) {
    // плюсовая температура ==============================================================================
    myOLED.drawBitmap(7, 40, sun, 32, 16);
  } else {
    // минусовая температура =============================================================================
    myOLED.drawBitmap(7, 40, winter, 32, 16);
    if (tempC < 0)
      setMinus(47, 35); // один знак температуры
    else
      setMinus(44, 35); // два знака температуры
    //tempC = -tempC;
  };

  myOLED.setFont(MegaNumbers);
  int tc = round(abc(tempC) * 10) / 10; // целая часть
  int tf = round(abc(tempC * 10)) % 10; // дробная часть

  if (tc > 9)
    myOLED.print(String(tc), 53, 15); // два знака
  else
    myOLED.print(String(tc), 77, 15); // один знак
  myOLED.print(String(tf), RIGHT, 15);
  setPoint(100, 51); // позиция запятой


  if (abc(tempC) <= 2) { //предупреждение о гололеде
    // показываем погоду
    msg_t = "POSSIBLE ICE";
    myOLED.drawBitmap(7, 40, winter, 32, 16);
    if (currentMillis - previousSec >= intervalMsg) {
      // сохраняем время последнего показа
      previousSec = currentMillis;
      if (msgState == LOW)
        msgState = HIGH;
      else
        msgState = LOW;
    }
  } else msgState = HIGH; // показываем только аккум

  myOLED.setFont(SmallFont);

  if (msgState)
    myOLED.print(msg_a, CENTER, 5);
  else
    myOLED.print(msg_t, CENTER, 5); // сообщение погоды

  myOLED.update();
  delay(25);
}

void setPoint(int x, int y)
{ // рисуем запятую
  myOLED.setPixel(x, y);
  myOLED.setPixel(x + 1, y);

  myOLED.setPixel(x, y + 1);
  myOLED.setPixel(x + 1, y + 1);

  myOLED.setPixel(x + 1, y + 2);
  myOLED.setPixel(x,  y + 3);
}

void setMinus(int x, int y)
{ // рисуем минус
  myOLED.drawLine(x, y,  x + 8, y);
  myOLED.drawLine(x, y + 1, x + 8, y + 1);
}
float abc(float x) {
  if (x >= 0) {
    return x;
  }
  else {
    return -x;
  }
}

 

konog
Offline
Зарегистрирован: 17.12.2015

Бузер активный при подаче +5 вольт он работает

konog
Offline
Зарегистрирован: 17.12.2015

Пока взял пьезо бузер

Я так понимаю нужно это сделать

по типу

while (var < 3) {

      tone (3, 1300); //включаем на 1200 Гц
      delay (300);
      tone (3, 800); //включаем на 1200 Гц
      delay (300);
      var++;

      noTone(3);
    }

 

только не могу понять куда его вставить

 

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

Вы же писали, что у Вас активный пьезоизлучатель. Зачем ему tone?

konog
Offline
Зарегистрирован: 17.12.2015

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

Вы же писали, что у Вас активный пьезоизлучатель. Зачем ему tone?

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