DS3231 Real Time Clock i wysyłanie czasu za pomocą modułu nRF24L01

Dziś na tapecie wyjątkowo precyzyjny moduł zegara. Chcę go wykorzystać w moim inteligentnym domu jako podstawowy zegar, który będzie sterował wszystkimi urządzeniami włączanymi lub wyłączanymi w określonym czasie. Na razie robimy prosty układ sterujący lampką w czasie.

Źródło to: Viral Science – DS3231 jako trigger

Łączenie modułu z nano:

Świetna biblioteka z porządną dokumentacją: http://www.rinkydinkelectronics.com/library.php?id=73

Kod programu dla Nano:

Uwaga, w czasie ładowania programu do płytki Nano, wybrać musiałem opcję (Old Bootloader). Tylko wtedy transmisja przebiegała prawidłowo. Moduł mam sprzed kilku lat. Arduino IDE 1.8.x

//VIRAL SCIENCE
//SPECIFIC TIME TRIGGER RELAY
#include <DS3231.h>

int Relay = 2;

//DS3231  rtc(SDA, SCL); //Arduino UNO
DS3231  rtc(A5, A4); // Nano
Time t;

const int OnHour = 0; //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 1;
const int OffHour = 0; //SET TIME TO OFF RELAY
const int OffMin = 2;

void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);

  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,HIGH);
    Serial.println("LIGHT ON");
    }

    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,LOW);
      Serial.println("LIGHT OFF");
    }
}
Przesyłanie czasu modułem radiowym:

Teraz mały test jak daleko da się przesyłać aktualny czas pobrany z DS3231 za pomocą modułu radiowego nRF24L01. Otóż w obrębię mieszkania (10m + ściany) nie było żadnego problemu, transmisja przebiega bez zakłóceń. Ustawiłem radio.setPALevel(RF24_PA_HIGH). Przy RF24_PA_LOW w obrębie pokoju działało dobrze, poza transmisja się rwała.

Łączenia:

Kod dla TX i RX:

TX – nadajnik, moduł z zegarem

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <DS3231.h>;

RF24 radio(7, 8); // CE, CSN

#define SDA_PIN A5  // SDA for Nano
#define SCL_PIN A4  // SCL for Nano

DS3231  rtc(SDA_PIN, SCL_PIN);
Time t;
int dataTransmitted[3];

const byte address[5] = "00001";

void setup() {
  Serial.begin(9600);
  rtc.begin();
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.stopListening();
}

void loop() {
  t = rtc.getTime();
  dataTransmitted[0] = t.hour;
  dataTransmitted[1] = t.min;
  dataTransmitted[2] = t.sec;

  radio.write(&dataTransmitted, sizeof(dataTransmitted));
//  Serial.print(t.hour);
//  Serial.print(" hour(s), ");
//  Serial.print(t.min);
//  Serial.println(" minute(s)");

  Serial.println(" ");

  delay(1000);
}

RX – odbiornik

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*
* Odbiornik Arduino UNO
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[5] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    int dataReceived[3];
    radio.read(&dataReceived, sizeof(dataReceived));
    Serial.print("Czas: ");
    Serial.print(dataReceived[0]);
    Serial.print(" : ");
    Serial.print(dataReceived[1]);
    Serial.print(" : ");
    Serial.println(dataReceived[2]);

  }
}

kod oryginalny: https://drive.google.com/open?id=1s3We_v7Plbq7HlEwKliaqWgKhNDqsBpG
połączenie: https://drive.google.com/file/d/1lifntAlxlamBx739VILh2TYvS0xDM-a_

LINKI:

https://www.elec-cafe.com/arduino-wireless-temperature-lcd-display-nrf24l01-dht11/
Biblioteka Sodaq_DS3231
DS3231 Real Time Clock + Temperature Sensing using Arduino
David Watts
How to Electronics

Dodaj komentarz