IoT LL5
IoT LL5
Raport
Disciplina: Internetul Lucrurilor(IoT)
Tema: “Control”
Chişinău 2022
Sarcina lucrării
Să se realizeze o aplicație in baza de MCU care va implementa sisteme de control pentru:
Control temperatura sau umiditate cu aplicarea metodei de control On-Off cu histerezis cu acționare prin
releu. Control turații motor cu aplicarea metodei PID cu un encoder în calitate de senzor, și driver L298
pentru aplicarea puterii la motor.
NOTA: in p (b) se poate alege și la alt parametru de control, cu constrângerea ca acționarea va fi cu o
rezoluție de min 8 biți.
Set point (valoarea de referința pentru control) se va seta de la una din surse, la alegere:
- Un potențiometru;
- Doua butoane pentru UP/Down;
- Sensor encoder;
- Keypad;
- Interfața serial;
Valoarea de Setpoint si cea Curenta se vor afișa la LCD.
Problema 1
1. Schema
#define VRX_PIN A0
#define VRY_PIN A1
#define TEMP_PIN A5
TempSensor tempSensor(TEMP_PIN);
Relay thermostat(THERMOSTAT_PIN, false);
bool lastThermostatState;
bool shouldThermostatBeActive(float tempC);
void controlThermostat();
void controlMinTemp() {
Joystick::Move move = joystick->singleRead();
switch (move)
{
case Joystick::Move::UP:
if (minTemp < 50) {
minTemp++;
}
displayMinTemp();
break;
case Joystick::Move::DOWN:
if(minTemp > 1) {
minTemp--;
}
displayMinTemp();
break;
}
}
bool shouldThermostatBeActive(float tempC) {
if (tempC < minTemp) return true;
return false;
}
void controlThermostat() {
bool thermostatState = shouldThermostatBeActive(tempSensor.getTempCelsius());
3. Rezultatul
Figura 1.2 – Stare inițială
Problema 2
Figura 2.1 – Schema circuitului
1. Codul sursă:
#include <Arduino.h>
#include <AxisJoystick.h>
#include <LiquidCrystal.h>
#include "MotorDriver.h"
extern "C"
{
#include "pid.h"
}
#define IN1 13
#define IN2 12
#define ENA1 5
#define ENC1 3
#define ENC2 2
#define PULSES_PER_REVOLUTION 24
#define VRX_PIN A0
#define VRY_PIN A1
pid_t pid;
volatile double actualSpeed;
void motorControl();
void setPointControl();
switch (move)
{
case Joystick::Move::UP:
if (setpoint < 255) {
setpoint += 10;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::DOWN:
if(setpoint > -255) {
setpoint -= 10;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::RIGHT:
if (setpoint < 255) {
setpoint += 50;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
case Joystick::Move::LEFT:
if(setpoint > -255) {
setpoint -= 50;
}
displaySetPoint();
pid_set_setpoint(&pid, setpoint);
break;
}
}
void motorControl()
{
double rpmSpeed = speedToRpm(actualSpeed);
double computedSpeed = pid_compute(&pid, abs(rpmSpeed));
displayMotorStats();
if (setpoint < 0) {
motor.reverse(abs(computedSpeed));
} else if (setpoint > 0) {
motor.forward(computedSpeed);
} else {
motor.stop();
}
}
double speedToRpm(double speed)
{
return speed / PULSES_PER_REVOLUTION * 60.0;
}
attachInterrupt(digitalPinToInterrupt(ENC1), readEncoder, RISING);
pid_init(&pid, abs(setpoint), kp, ki, kd, minPwm, maxPwm);
void readEncoder()
{
static uint32_t prevTime = 0;
uint32_t currentTime = micros();
double deltaTime = ((double)(currentTime - prevTime)) * 0.000001;
prevTime = currentTime;
}
2. Rezultatul