Iordache Ionut-Iulian
Schemă electrica:
Interfata Web:
Interfata Mobile:
// Arduino Side Code
#include <SD.h> // need to include the SD library
#include <TMRpcm.h> // also need to include this library (used to create instance of TMRpcm)
#include <SPI.h> // and this one too for SPI protocol
#include "DHT.h" // temperature and humidity sensor library
#include <Wire.h> // wire library
#include <LiquidCrystal_I2C.h> // liquid crystal with I2C library
#include <SoftwareSerial.h> // used to transmit data to ESP8266
#define ultrasoundTrigger 4 // pin 4 used as output with ultrasonic sensor
#define ultrasoundEcho 2 // pin 2 used as input with ultrasonic sensor
#define smokeA0 A0 // pin A0 used as input with air-quality gas sensor
#define DHTPIN A1 // pin A1 used as input with temp&hum(DHT11) sensor
#define DHTTYPE DHT11 // sensor type = DHT11
#define SD_ChipSelectPin 10 // pin 10 used as Chip Select - CS with SD module
#define SPEAKER_PIN 9 // pin 9 used as speaker
long duration; // variable for the duration of sound wave travel
float ultrasoundDistance; // variable for the distance measurement
String strArduinoToESP; // string to transmit from Arduino to ESP8266 NODEMCU
DHT dht(DHTPIN, DHTTYPE); // initialize DHT11 sensor
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
TMRpcm tmrpcm; // used by SD card to play sound
SoftwareSerial espSerial(5, 6); // RX & TX on pins 5 & 6
void setup() {
Serial.begin(9600);
espSerial.begin(9600);//TODO
// Ultrasonic sensor logic
// Serial.println("Ultrasonic Sensor HC-SR04 Test");
pinMode(ultrasoundTrigger, OUTPUT); // Sets the trigPin as an OUTPUT
pinMode(ultrasoundEcho, INPUT); // Sets the echoPin as an INPUT
// Smoke sensor logic
//Serial.println(F("Smoke sensor test!"));
pinMode(smokeA0, INPUT);
// DHT11 sensor logic
//Serial.println(F("DHT11 sensor test!"));
dht.begin();
// LCD&I2C logic
lcd.init(); // initialize the lcd
lcd.backlight(); // Turn on backlight
// SDcard logic
tmrpcm.speakerPin = SPEAKER_PIN; // speaker ouput pin 9
if(!SD.begin(SD_ChipSelectPin)) { // check connection and return proper message
// Serial.println("SD fail");
return;
}
tmrpcm.setVolume(6); // set output volume on pin selected
tmrpcm.play("test.wav"); // play sound from file
delay(22000);
// Welcome message
lcd.setCursor(0, 0); // set cursor at top left
lcd.print(" Welcome Home "); // print string
lcd.setCursor(0, 1); // set cursor at top left
lcd.print(" SIR "); // print string
delay(3000);
}
void loop() {
delay(1500); // process to repeat every 3s (1.5s + 1.5s underneath)
// Serial.println("=========");
// Read from smoke sensor
int smokeVal = analogRead(smokeA0);
// Serial.print("Pin A0 smoke: ");
// Serial.print(smokeVal);
// Serial.println(" ppm");
// Read from temp&hum(DHT11) sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
// Serial.print(F("Humidity: "));
// Serial.print(h);
// Serial.print(F(" % | Temperature: "));
// Serial.print(t);
// Serial.println(F(" C"));
// Clears the trigPin condition
digitalWrite(ultrasoundTrigger, LOW);
delayMicroseconds(2);
// Sets the trigPin HIGH (ACTIVE) for 10 microseconds
digitalWrite(ultrasoundTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(ultrasoundTrigger, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(ultrasoundEcho, HIGH);
delay(1000);
// Calculating the distance
ultrasoundDistance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back)
// Displays the distance on the Serial Monitor
// Serial.print("Distance: ");
// Serial.print(distance);
// Serial.println(" cm");
// Print on LCD
lcd.setCursor(0, 0); // set cursor at top left
lcd.print("Hum: "); // print string
lcd.print(h); // humidity value
lcd.print(" % "); // unit
// ---
lcd.setCursor(0, 1); // set cursor at left space on 2nd row
lcd.print("Temp: "); // print string
lcd.print(t); // temperature value
lcd.print(" C "); // unit
// ---
delay(1500);
lcd.setCursor(0, 0); // set cursor at top left
lcd.print("Gas val: "); // print string
lcd.print(smokeVal); // gas value
lcd.print(" ppm"); // unit
// ---
lcd.setCursor(0, 1); // set cursor at left space on 2nd row
lcd.print("Dist: "); // print string
lcd.print(ultrasoundDistance); // distance value
lcd.print(" cm"); // unit
// Send data to ESP as a string
strArduinoToESP = strArduinoToESP + smokeVal + "," + h + "," + t + "," + ultrasoundDistance; //TODO am h si t ca float si in ex sunt int-uri
// Serial.println(strArduinoToESP);
espSerial.println(strArduinoToESP); // transmit string to ESP8266
strArduinoToESP = ""; // reinitialize string value
}
// ESP8266 Side Code
#define BLYNK_TEMPLATE_ID "TMPL3SY-JM6J"
#define BLYNK_DEVICE_NAME "Blynk LED"
#define BLYNK_AUTH_TOKEN "RkiSi9tnBfPHmic1gaBwiC9upodMfHy1"
#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG
#define APP_DEBUG
// Uncomment your board, or configure a custom board in Settings.h
//#define USE_SPARKFUN_BLYNK_BOARD
//#define USE_NODE_MCU_BOARD
//#define USE_WITTY_CLOUD_BOARD
//#define USE_WEMOS_D1_MINI
#include "BlynkEdgent.h"
#include <SoftwareSerial.h>
String strArduinoToESP; // string received from Arduino to ESP8266 NODEMCU
int smokeVal;
float humVal, tempVal, ultrasoundVal;
char rdata; // received character
const int motorspeed_pin = D1;
const int DIRA = D2;
const int DIRB = D7;
BLYNK_WRITE(V0)
{
int pinValue = param.asInt();
digitalWrite(D5, pinValue);
}
BLYNK_WRITE(V5)
{
int pinValue = param.asInt();
digitalWrite(D6, pinValue);
}
BLYNK_WRITE(V7)
{
int pinValue = param.asInt();
if (pinValue == 1) {
digitalWrite(motorspeed_pin, HIGH);
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
} else if (pinValue == 0) {
digitalWrite(motorspeed_pin, LOW);
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
}
}
void sendSensorsData() {
Blynk.virtualWrite(V1, smokeVal);
delay(200);
Blynk.virtualWrite(V2, humVal);
delay(200);
Blynk.virtualWrite(V3, tempVal);
delay(200);
Blynk.virtualWrite(V4, ultrasoundVal);
delay(200);
}
void setup()
{
Serial.begin(9600);
delay(100);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(motorspeed_pin, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
BlynkEdgent.begin();
delay(2000);
edgentTimer.setInterval(1000L, sendSensorsData);
}
void loop() {
if (Serial.available() > 0 ) {
rdata = Serial.read();
strArduinoToESP = strArduinoToESP + rdata;
// Serial.print(rdata);
if ( rdata == '\n') {
// Serial.println(strArduinoToESP);
String l = getValue(strArduinoToESP, ',', 0);
String m = getValue(strArduinoToESP, ',', 1);
String n = getValue(strArduinoToESP, ',', 2);
String p = getValue(strArduinoToESP, ',', 3);
smokeVal = l.toInt();
humVal = m.toFloat();
tempVal = n.toFloat();
ultrasoundVal = p.toFloat();
// Serial.print("val: ");
// Serial.print(smokeVal);
// Serial.print(" | val: ");
// Serial.print(humVal);
// Serial.print(" | val: ");
// Serial.print(tempVal);
// Serial.print(" | val: ");
// Serial.print(ultrasoundVal);
// Serial.print(" | val: ");
// Serial.println(" |");
BlynkEdgent.run();
delay(1000);
edgentTimer.run(); // Initiates SimpleTimer
delay(1000);
strArduinoToESP = "";
}
}
}
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
08.05.2022 : Definitivare carcasa necesara proiect cat si testare amplificator realizat + bug fixing.
14.05.2022 : Consolidare idee comunicatie dintre cele 2 microcontrolere pana la interactiunea cu serverul Blynk.
15.05.2022 : Alegerea intre diverse scheme de interconectare a celor 2 microcontrolere dupa mai multe teste.
21.05.2022 : Cel mai urat moment atunci cand ceea ce mergea pe bredboard are interferente si un comportament nedefinit odata adaugat la proiectul final.
22.05.2022 : Completarea sectiunilor OCW.
22.05.2022 : Realizare schema electrica si modificare schema bloc.
22.05.2022 : Adaugarea de imagini sugestive cu privire la parcursul proiectului.
Resurse software:
Resurse hardware: