#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
RTC_DS1307 rtc;
#define Apg 12 // A+ line do primeiro motor de passo (verde)
#define Amg 13 // A- line
#define Bpg 11 // B+ line
#define Bmg 10 // B- line
#define Apc 6 // Definição dos pinos do segundo motor de passo (ciano)
#define Amc 7
#define Bpc 5
#define Bmc 4
#define PinPir 3
int PIR, tempo_analog, tempo, temp_analog, rot;
float temp, tempo_exec;
float tempo_pir = 0;
float grau_verde = 0;
float grau_ciano = 0;
void setup() {
// put your setup code here, to run once:
pinMode(Apg,OUTPUT); pinMode(Amg,OUTPUT);
pinMode(Bpg,OUTPUT); pinMode(Bmg,OUTPUT);
pinMode(Apc,OUTPUT); pinMode(Amc,OUTPUT);
pinMode(Bpc,OUTPUT); pinMode(Bmc,OUTPUT);
pinMode(PinPir, INPUT);
lcd.init();
lcd.backlight();
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("RTC não identificado!");
Serial.flush();
abort();
}
}
void loop() {
// put your main code here, to run repeatedly:
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Hora atual: ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
PIR = digitalRead(PinPir);
lcd.setCursor(0,1);
lcd.print(" Temp.: ");
lcd.print(temp, 2);
lcd.print(" [C] ");
tempo_exec = millis();
tempo_exec = tempo_exec/1e3;
tempo_exec = tempo_exec - tempo_pir;
if (PIR == LOW)
{
rot = rot;
grau_verde = grau_verde + 4*1.8;
grau_ciano = grau_ciano - 4*1.8;
}
if (PIR == HIGH)
{
rot = !rot;
tempo_pir = millis();
tempo_pir = tempo_pir/1e3;
grau_verde = grau_verde - 4 *1.8;
grau_ciano = grau_ciano + 4 *1.8;
delay(5000);
}
if (rot == 0)
{
roda_horario_verde_anti_ciano();
}
else if (rot != 0)
{
roda_horario_ciano_anti_verde();
}
if (tempo_pir != 0)
{
lcd.setCursor(0,2);
lcd.print(" Tempo PIR:");
lcd.print(tempo_exec, 2);
lcd.print(" [s] ");
}
else
{
tempo_exec = 0;
lcd.setCursor(0,2);
lcd.print(" Tempo PIR:");
lcd.print(tempo_exec, 2);
lcd.print(" [s] ");
}
if(abs(grau_verde) >= 360)
{
grau_verde = (abs(grau_verde)-360)*grau_verde/grau_verde;
float angulo_verde = grau_verde;
}
else
{
float angulo_verde = grau_verde;
}
if(abs(grau_ciano) >= 360)
{
grau_ciano = (abs(grau_ciano)-360)*grau_ciano/grau_ciano;
float angulo_ciano = grau_ciano;
}
else
{
float angulo_ciano = grau_ciano;
}
float angulo_verde = grau_verde;
float angulo_ciano = grau_ciano;
lcd.setCursor(0,3);
lcd.print("MV:");
lcd.print(angulo_verde,0);
lcd.print(" MC:");
lcd.print(angulo_ciano,0);
lcd.print(" graus ");
}
void roda_horario_verde_anti_ciano()
{
ler_tempo();
delay(tempo);
digitalWrite(Bmg,LOW) ; digitalWrite(Apg,HIGH);
digitalWrite(Amc,LOW) ; digitalWrite(Bmc,HIGH);
delay(tempo);
digitalWrite(Apg,LOW) ; digitalWrite(Bpg,HIGH);
digitalWrite(Bpc,LOW) ; digitalWrite(Amc,HIGH);
delay(tempo);
digitalWrite(Bpg,LOW) ; digitalWrite(Amg,HIGH);
digitalWrite(Apc,LOW) ; digitalWrite(Bpc,HIGH);
delay(tempo);
digitalWrite(Amg,LOW) ; digitalWrite(Bmg,HIGH);
digitalWrite(Bmc,LOW) ; digitalWrite(Apc,HIGH);
}
void roda_horario_ciano_anti_verde()
{
ler_tempo();
delay(tempo);
digitalWrite(Amg,LOW) ; digitalWrite(Bmg,HIGH);
digitalWrite(Bmc,LOW) ; digitalWrite(Apc,HIGH);
delay(tempo);
digitalWrite(Bpg,LOW) ; digitalWrite(Amg,HIGH);
digitalWrite(Apc,LOW) ; digitalWrite(Bpc,HIGH);
delay(tempo);
digitalWrite(Apg,LOW) ; digitalWrite(Bpg,HIGH);
digitalWrite(Bpc,LOW) ; digitalWrite(Amc,HIGH);
delay(tempo);
digitalWrite(Bmg,LOW) ; digitalWrite(Apg,HIGH);
digitalWrite(Amc,LOW) ; digitalWrite(Bmc,HIGH);
}
void ler_tempo()
{
temp_analog = analogRead(A1);
const float BETA = 3950;
temp = 1 / (log(1 / (1023. / temp_analog - 1)) / BETA + 1.0 / 298.15) - 273.15;
if (temp > 50)
{
tempo = 5;
}
else
{
tempo_analog = analogRead(0);
tempo = map(tempo_analog, 0, 1023, 25, 5);
}
}