К основному контенту

Вольтметр, Термометр, Алкотестер для авто



Схема


Плата













Скетч

#include "U8glib.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI

const int buttonPin = 12;
const int AlcoOnPin = 13; //Цифровой выход на включение датчика MQ-3
const int AlcoReadPin = A0; //Аналоговый вход на прием данных с датчика MQ-3
const int analogBat = A1; // Аналоговий вхід для заміра напруги бортової мережі 

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  
  sensors.begin(); // Запускаем библиотеку измерения температуры

  pinMode(buttonPin, INPUT);
  
  pinMode(AlcoOnPin, OUTPUT);
  digitalWrite(AlcoOnPin, LOW);

  analogReference(EXTERNAL);

  u8g.firstPage();  
        do {
          u8g.setFont(u8g_font_10x20);
          u8g.drawStr(30, 24, "F I A T");
        } while( u8g.nextPage());
}

void loop() {

  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW) {
   
    VoltTemp();
      
  } else {

    AlcoTest();
  }

void VoltTemp() {
    
    float RawValue = 0;                           // Зчитане значення напруги з аналогового входу
    for (byte i=0; i<20; i++){
    RawValue = RawValue + analogRead(analogBat);  // Зчитуем значення напруги
    delay(100);
    }
    RawValue = RawValue / 20;
    
    float Vin = (RawValue  * 2.5) / 1023.0;   // Розрааховуем заначення напруги делителя
    float Vbat = Vin / (14.8 / (14.8 + 101.8)); // Рсчитываем заначение напряжения борт. сети (R2 / (R1 + R2)

    if (Vbat < 12.00) tone(10, 3000, 1000); // Включаем сигнал если напряжение на бортсети меньше 11.5В

    sensors.requestTemperatures();      // Запрос на измерение темпенатурі
    float Temp = sensors.getTempCByIndex(0);  // Получение значения температурі

    
    u8g.firstPage();  
     do {
        // graphic commands to redraw the complete screen should be placed here  
        u8g.setFont(u8g_font_9x15);
        u8g.setPrintPos(20, 10);
        u8g.print(Vbat);
        u8g.drawStr( 100, 10, "V");
        u8g.setPrintPos(20, 30);
        u8g.print(Temp);
        u8g.drawStr( 100, 30, "C");
     } while( u8g.nextPage());
}

void AlcoTest() {
  digitalWrite(AlcoOnPin, HIGH); // Включаем MQ-3

  // Выдержка времени для прогрева датчика
  int timer = 30;
  for (int i=0; i <= 30; i++){ 
      u8g.firstPage();
      do {
        u8g.setFont(u8g_font_10x20);
        u8g.setPrintPos(55, 24);
        u8g.print(timer);
      } while( u8g.nextPage());
  timer=timer-1;
  delay(1000);
  } 
     
  // Подаем звуковой сигнал после прогрева MQ-3
  u8g.firstPage();  
      do {
        u8g.setFont(u8g_font_10x20);
        u8g.drawStr(20, 24, "S T A R T");
      } while( u8g.nextPage());
  delay (1000);
  tone(10, 3000, 400); 
  delay(1000);
  tone(10, 3000, 400);
  delay(1000);
  tone(10, 3000, 400);
  delay(1000);

  // Дуем  
  buttonState = 0;
  while (buttonState == LOW){                           // Крутим цикл пока не нажата кнопка
  buttonState = digitalRead(buttonPin);
  int sensorValue = analogRead(AlcoReadPin);
  int AlcoTester = map(sensorValue, 350, 1023, 0, 100);
      u8g.firstPage();  
        do {
          u8g.setFont(u8g_font_10x20);
          u8g.setPrintPos(50, 24);
          u8g.print(AlcoTester);
        } while( u8g.nextPage());
  delay (100);
  }
      u8g.firstPage();  
        do {
          u8g.setFont(u8g_font_10x20);
          u8g.drawStr(25, 24, "E X I T");
        } while( u8g.nextPage());
  delay (1000);                      // Задержка для нажатия кнопки для выхода из режима алкотестера
  
  digitalWrite(AlcoOnPin, LOW);      // Вsключаем MQ-3
  
}

Комментарии

Популярные сообщения из этого блога

Prototype shield V5 для ARDUINO UNO

Модуль генератор на NE555