#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
char *res = malloc(10);
// CONFIGURAZIONE
const byte P_LED = 9;
const byte P_SET = 6;
const byte P_RESET = 7;
const byte P_RELE_APRE = 10; //relè x sbloccare porta
const byte P_RELE_BLOCCA = 11; //rele x bloccare porta
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345); //identifiacativo magnetometro
LiquidCrystal_I2C lcd(0x27, 16, 2); //display lcd x la visualizzazione dell orario
RTC_DS3231 rtc;
DateTime now;
char str[10];
int stato1 = 0;
int val = 0;
int val0 = 0;
bool isFirst = true;
// Buffer per la composizione delle stringhe da inviare via seriale
char outBuf[20];
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("start");
lcd.backlight();
lcd.init();
//pulsanti set e reset
pinMode(P_SET, INPUT);
pinMode(P_RESET, INPUT);
pinMode(P_LED, OUTPUT);
pinMode(P_RELE_APRE, OUTPUT);
pinMode(P_RELE_BLOCCA, OUTPUT);
digitalWrite(P_RELE_APRE, HIGH);
digitalWrite(P_RELE_BLOCCA, HIGH);
if (!rtc.begin()) { //inizializzo l rtc
Serial.println("Couldn't find RTC");
while (true)
;
}
if (!rtc.lostPower()) {
//Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
if (!mag.begin()) //inizializzo il magnetometro
{
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while (1)
;
}
}
#if(0)
void loop() {
MostraOra();
bussola();
delay(100);
}
#endif
byte test = 3;
void loop() {
switch (test) {
case 1:
Wire.beginTransmission((byte)HMC5883_ADDRESS_MAG);
Wire.write(HMC5883_REGISTER_MAG_OUT_X_H_M);
Wire.endTransmission(false);
Wire.requestFrom((byte)HMC5883_ADDRESS_MAG, (byte)6, true);
{
uint8_t xa = Wire.read();
uint8_t xb = Wire.read();
uint8_t ya = Wire.read();
uint8_t yb = Wire.read();
uint8_t za = Wire.read();
uint8_t zb = Wire.read();
int magx = (int16_t)(xb | ((int16_t)xa << 8));
int magy = (int16_t)(yb | ((int16_t)ya << 8));
int magz = (int16_t)(zb | ((int16_t)za << 8));
Serial.print("x = "); Serial.println(magx);
Serial.print("Y = "); Serial.println(magy);
Serial.print("Z = "); Serial.println(magz);
//Wire.endTransmission(true);
test = 0;
}
break;
case 2: // read identification register IRA, IRB and IRC
Serial.println("2");
Wire.beginTransmission((byte)HMC5883_ADDRESS_MAG);
Wire.write(HMC5883_REGISTER_MAG_IRA_REG_M);
Wire.endTransmission(false);
Wire.requestFrom((byte)HMC5883_ADDRESS_MAG, (byte)3, true);
{
char str[4] = {0};
str[0] = Wire.read();
str[1] = Wire.read();
str[2] = Wire.read();
Serial.println(str);
test = 1;
}
break;
case 3:
Wire.beginTransmission((byte)HMC5883_ADDRESS_MAG);
Wire.write(HMC5883_REGISTER_MAG_OUT_X_H_M);
Wire.write(9);
Wire.endTransmission(true);
test = 0;
break;
}
}
void bussola() { //evento bussola per indicare i gradi del magnetometro,
sensors_event_t event;
mag.getEvent(&event);
float heading = atan2(event.magnetic.y, event.magnetic.x);
float declinationAngle = 0.06;
heading += declinationAngle;
if (heading < 0) {
heading += 2 * PI;
}
if (heading > 2 * PI) {
heading -= 2 * PI;
}
//float heading = 2;
float headingDegrees = heading * 180 / M_PI;
// Manda la lettura ("B"=bussola)
char deg[8];
// Gradi: ###.## quindi 6 caraatteri totali, inclusi 2 decimali)
dtostrf(headingDegrees, 6, 2, deg);
sprintf(outBuf, "B;%s", deg);
Serial.println(outBuf);
delay(500);
}
void MostraOra() {
switch (stato1) {
case 0:
displayTime();
break;
case 1:
setHour();
break;
case 2:
setMinute();
break;
case 3:
setSecond();
break;
case 4:
setyear();
break;
case 5:
setmonth();
break;
case 6:
setday();
break;
}
}
unsigned long t1 = 0;
void displayTime() {
if (t1 == 0 || millis() - t1 > 1000) {
if (t1 == 0) lcd.clear();
t1 = millis();
now = rtc.now();
lcd.setCursor(4, 1);
sprintf(str, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(str);
lcd.setCursor(3, 0);
sprintf(str, "%02d/%02d/%02d", now.day(), now.month(), now.year());
lcd.print(str);
}
if (digitalRead(P_SET)) {
//imposta ora
stato1 = 1;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(300);
isFirst = true;
}
}
int seth = 0;
void setHour() {
if (isFirst) {
lcd.clear();
now = rtc.now();
seth = now.hour();
lcd.setCursor(0, 0);
lcd.print("Imposta ora");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", seth);
lcd.print(str);
if (digitalRead(P_RESET)) {
seth++;
if (seth >= 24) seth = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva ora scelta e passa ai minuti
rtc.adjust(DateTime(now.year(), now.month(), now.day(), seth, now.minute(), now.second()));
stato1 = 2;
Serial.print("Stato1 = ");Serial.println(stato1);
isFirst = true;
delay(200);
}
}
int setm;
void setMinute() {
if (isFirst) {
lcd.clear();
now = rtc.now();
setm = now.minute();
lcd.setCursor(0, 0);
lcd.print("Imposta minuti");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", setm);
lcd.print(str);
if (digitalRead(P_RESET)) {
setm++;
if (setm >= 60) setm = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva min scelta e passa ai sec
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), setm, now.second()));
stato1 = 3;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(200);
isFirst = true;
}
}
int sets = 0;
void setSecond() {
if (isFirst) {
lcd.clear();
now = rtc.now();
sets = now.second();
lcd.setCursor(0, 0);
lcd.print("Imposta sec.");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", sets);
lcd.print(str);
if (digitalRead(P_RESET)) {
sets++;
if (sets >= 60) sets = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva sec scelta e passa ai minuti
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sets));
stato1 = 4;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(200);
isFirst = true;
}
}
int sety = 0;
void setyear() {
if (isFirst) {
lcd.clear();
now = rtc.now();
sety = now.year();
lcd.setCursor(0, 0);
lcd.print("Imposta anno");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", sety);
lcd.print(str);
if (digitalRead(P_RESET)) {
sety++;
if (sety >= 9999) sety = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva sec scelta e passa ai minuti
rtc.adjust(DateTime(sety, now.month(), now.day(), now.hour(), now.minute(), now.second()));
stato1 = 5;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(200);
isFirst = true;
}
}
int setmo = 0;
void setmonth() {
if (isFirst) {
lcd.clear();
now = rtc.now();
setmo = now.month();
lcd.setCursor(0, 0);
lcd.print("Imposta mese");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", setmo);
lcd.print(str);
if (digitalRead(P_RESET)) {
setmo++;
if (setmo >= 12) setmo = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva sec scelta e passa ai minuti
rtc.adjust(DateTime(now.year(), setmo, now.day(), now.hour(), now.minute(), now.second()));
stato1 = 6;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(200);
isFirst = true;
}
}
int setd = 0;
void setday() {
if (isFirst) {
lcd.clear();
now = rtc.now();
setd = now.day();
lcd.setCursor(0, 0);
lcd.print("Imposta giorno");
isFirst = false;
}
lcd.setCursor(0, 1);
sprintf(str, "%02d", setd);
lcd.print(str);
if (digitalRead(P_RESET)) {
setd++;
if (setd >= 32) setd = 0;
delay(200);
}
if (digitalRead(P_SET)) {
//salva sec scelta e passa ai minuti
rtc.adjust(DateTime(now.year(), now.month(), setd, now.hour(), now.minute(), now.second()));
stato1 = 0;
Serial.print("Stato1 = ");Serial.println(stato1);
delay(200);
isFirst = true;
}
}