//****************************************************************************
// MULTI-FUNCTIONS-SHIELD
//****************************************************************************
//----------------------------------------------------------------------------
// Due to lack of DS18B20 or LM35 sensors in wokwi library, here is used DHT22
//----------------------------------------------------------------------------
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include "DHT.h"
#define DHTPIN A4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
//-----------------------------------------------------------------------------
// 4 x led
//-----------------------------------------------------------------------------
#define pinLed1 10
#define pinLed2 11
#define pinLed3 12
#define pinLed4 13
//-----------------------------------------------------------------------------
// 4 Digits 7-segment display controlled by 2 x 74HC595
//-----------------------------------------------------------------------------
#define pinLatch 4
#define pinClock 7
#define pinData 8
//-----------------------------------------------------------------------------
// potentiometer
//-----------------------------------------------------------------------------
#define pinPot A0
//-----------------------------------------------------------------------------
// 3 x pushbuttons
//-----------------------------------------------------------------------------
#define pinButton1 A1
#define pinButton2 A2
#define pinButton3 A3
//-----------------------------------------------------------------------------
// Ultrasonic distance sensor
//-----------------------------------------------------------------------------
#define pinEcho 5
#define pinTrig 6
//-----------------------------------------------------------------------------
// Servo
//-----------------------------------------------------------------------------
#define pinServo 9
//-----------------------------------------------------------------------------
// Buzzer
//-----------------------------------------------------------------------------
#define pinBuzzer 3
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// This project is mix of two examples on
// http://kabinet.fyzika.net/dilna/ARDUINO/funduino-periferie.php
//-----------------------------------------------------------------------------
unsigned char Dis_table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // definice cisel 0-10
unsigned char Dis_buf[] = {0xF1,0xF2,0xF4,0xF8}; // adresy LED zobrazovacu
unsigned char disbuff[] = {0, 0, 0, 0}; // pole odesilanych hodnot na LED
int rT=0; // pomocna promena
void setup() {
Serial.begin(9600);
pinMode(pinEcho, INPUT);
pinMode(pinTrig, OUTPUT);
pinMode(pinLatch,OUTPUT);
pinMode(pinClock,OUTPUT);
pinMode(pinData,OUTPUT); // nastaveni vystupu pro segmentovku
}
void display()
{
for(char i = 0; i <= 3; i++) // probene zobrazovace a zobrazi, co je treba
{
digitalWrite(pinLatch,LOW); // nastavi latch pro zapis
if(i == 1)
{
shiftOut(pinData,pinClock,MSBFIRST,Dis_table[disbuff[i]]&0x7F); // za prvnim cislem rozsvit i des. tecku
}
else
{
shiftOut(pinData,pinClock,MSBFIRST,Dis_table[disbuff[i]]);
}
shiftOut(pinData,pinClock,MSBFIRST,Dis_buf[i] ); // zapise adresu zobrazovace
digitalWrite(pinLatch,HIGH); // vypni latch
delay(2); // pockej 2 ms
}
}
void loop() {
digitalWrite(pinTrig, LOW); // signal LOW 2 us
delayMicroseconds(2);
digitalWrite(pinTrig, HIGH); // 10 us signalu HIGH
delayMicroseconds(10);
digitalWrite(pinTrig, LOW); // konec start pulzu
int distance = pulseIn(pinEcho, HIGH); // cekam do signalu HIGH
distance = distance/58; // prepocitani na vzdalenost
Serial.print(((float) distance / 100)); // odesli vzdalenost
Serial.println(" m");
rT= (int) (distance * 1); // vyrobi 4-ciferne cislo
disbuff[0]= rT/1000; // pocet tisicu na 1 zobrazovac
disbuff[1]= rT%1000/100; // pocet stovek na 2 zobrazovac
disbuff[2]= rT%100/10; // pocet desitek na 3 zobrazovac
disbuff[3]= rT%10; // pocet jednotek na 4 zobrazovac
for(char time = 0; time < 20; time++) // zapisovanim stejne hodnoty se to zdrzi a pritom neblikaji zobrazovace
{
display();
}
}