Arduino Polska Forum

Pełna wersja: DS1307 I2c Oled 0,96 I2c
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Mam pewien kod ze strony do DS1307 z Oledem ale nie dziala, wgrywac sie wgrywa ale nie dziala nie pokazuje daty kod podaje



#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS1307 RTC;
char days[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
  Serial.begin(115200);

   if ((DS1307_ON)) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;Wink;
  }
  delay(1000);
  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(30, 20);
  // Display static text
  display.println("RTC");
  display.display();
  delay(3000);
  display.clearDisplay();
}

void loop() {
  DateTime now = RTC.now();

  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.print(now.day());
  display.print('/');
  display.print(now.month());
  display.print('/');
  display.print(now.year());
  display.println(days[now.dayOfTheWeek()]);
  display.println(' ');
  display.setCursor(0, 40);
  if (now.hour() < 10)
    display.print('0');
  display.print(now.hour());
  display.print(':');
  if (now.minute() < 10)
    display.print('0');
  display.print(now.minute());
  display.print(':');
  if (now.second() < 10)
    display.print('0');
  display.println(now.second());
  display.display();
}
tej buzki tam nie ma to poprostu jakis skrót ze strony Fora
A coś w ogóle wypisuje serialu, pokazuje na displayu?

Trochę nie podoba mi się ta konstrukcja:
Kod:
if ((DS1307_ON)) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

Skąd w setup() może być ustawione na sensowną wartość DS1307_ON? Jakoś tak nic nie robisz z I2C? Biblioteka od RTC raczej tego nie inicjalizuje - na I2C może być wiele urządzeń, które ma być odpowiedzialne za zainicjowanie?
Sprawdź też adres, te oledy nie zawsze są z 0x3E.
(15-03-2024, 20:20)oscarX napisał(a): [ -> ]A coś w ogóle wypisuje serialu, pokazuje na displayu?

Trochę nie podoba mi się ta konstrukcja:
Kod:
if ((DS1307_ON)) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

Skąd w setup() może być ustawione na sensowną wartość DS1307_ON? Jakoś tak nic nie robisz z I2C? Biblioteka od RTC raczej tego nie inicjalizuje - na I2C może być wiele urządzeń, które ma być odpowiedzialne za zainicjowanie?
pokazuje jedynie 00:00Saturday i date 1/1/2007 a czasami pokazuje jakies kreski
(15-03-2024, 20:20)oscarX napisał(a): [ -> ]A coś w ogóle wypisuje serialu, pokazuje na displayu?

Trochę nie podoba mi się ta konstrukcja:
Kod:
if ((DS1307_ON)) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

Skąd w setup() może być ustawione na sensowną wartość DS1307_ON? Jakoś tak nic nie robisz z I2C? Biblioteka od RTC raczej tego nie inicjalizuje - na I2C może być wiele urządzeń, które ma być odpowiedzialne za zainicjowanie?
to pokazuje 11:00:49.026 -> Couldn't find RTC po przetlumaczeniu 11:00:49.026 -> Nie udało się znaleźć RTC
(16-03-2024, 02:39)kaczakat napisał(a): [ -> ]Sprawdź też adres, te oledy nie zawsze są z 0x3E.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS1307 DS1307_RTC;
char days[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
  Serial.begin(115200);

   if (! DS1307_RTC.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  DS1307_RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;Wink;
  }
  delay(1000);
  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(30, 20);
  // Display static text
  display.println("RTC");
  display.display();
  delay(3000);
  display.clearDisplay();
}

void loop() {
  DateTime now = DS1307_RTC.now();

  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.print(now.day());
  display.print('/');
  display.print(now.month());
  display.print('/');
  display.print(now.year());
  display.println(days[now.dayOfTheWeek()]);
  display.println(' ');
  display.setCursor(0, 40);
  if (now.hour() < 10)
    display.print('0');
  display.print(now.hour());
  display.print(':');
  if (now.minute() < 10)
    display.print('0');
  display.print(now.minute());
  display.print(':');
  if (now.second() < 10)
    display.print('0');
  display.println(now.second());
  display.display();
}  ten kod dziala poprawiony przezemnie tylko literka 1 od dnia literami sie przesunela tam gdziedata cyferkami
Ciekaw jestem, czy w pierwszym kodzie nie wystarczyło po prostu zmienić: if ((DS1307_ON)) na if ((!DS1307_ON)).

Grunt, że podołałeś. Brawo!