• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z wbudowaną biblioteką Wire
#1
Hej,
mam problem z wbudowaną biblioteką Wire.
Gdy próbuję uruchomić example sketch z biblioteki DS1307RTC to dostaję taki output jak na screenshocie.

kod wkleję na wszelki wypadek jednak jest to w żaden sposób niezmodyfikowany example skech SetTime z biblioteki DS1307RTC:
Kod:
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

próbowałem już odinstalować i zainstalować od nowa całe środowisko, jednak otrzymuję dokładnie ten sam efekt.

podłączone jest raczej prawidłowo SCL do SCL, SDA do SDA, GDN do GDN, VCC do 5V.

środowisko:
OS: Xubuntu 22.04.3 LTS x86_64
Arduino: UNO R3
moduł RTC: DS1307
zainstalowana wersja arduino CLI: 1.8.19

wcześniej korzystałem z vscode i uploadowałem program przy pomocy CLI jednak jak nie mogłem sobie poradzić z tym błędem to uznałem, że wszystko usuwam i zainstalowałem od nowa Arduino IDE.
poza modułem RTC do arduino podłączone są analogowy czujnik temperatury LM35, trzy przyciski oraz LCD 2x16,  całość poprzez płytki stykowe.

czy macie jakieś pomysły co jeszcze mógłbym spróbować zrobić żeby móc normalnie ustawić czas w module RTC (a potem go odczytywać)?


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Znajdź sobie takie szkic i2c_scanner i sprawdź czy wykrywa Ci ten zegarek. Na zrzucie ekranu masz przecież komunikat, że nie wykrywa zegara. Linie I2C muszą być podciągnięte do Vcc przez rezystor o odpowiedniej wartości, typowo są używane 5-10k, nic o nich nie wspomniałeś. Jeśli to jest jakiś moduł, może mieć wbudowane, ale warto wziąć do ręki multimetr i zmierzyć (bez napięcia) jaka jest rezystancja między liniami DATA i CLK a VCC.
No i gdzie masz podłączone te pozostałe rzeczy, linie I2C są na pinach A4 i A5.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
dzięki wielkie za odpowiedź. Smile
to co mam to dokłądnie ten moduł.
czyli było źle podłączone.
teraz jest
SDA do 5v oraz A4
SCL do 5v oraz A5

jak podłączałem do VCC poprzez rezystory 10k (tak sugerował jakiś filmik na yt) to był identyczny efekt jak bez tego. próbowałem również podłączyć do SDA i SCL na płytce Arduino (z rezystowami i bez nich) i był identyczny efekt

efekt:
wgrałem i2c_scanner i dostawałem:
Kod:
I2C Scanner
Scanning...

we wszystkich przypadkach, które wyżej opisywałem. i tak wisi sobie bez dalszgo efektu przez kilka/kilkanaście minut.
multimetru niestety nie mam żeby nim zweryfikować. masz może jakieś jeszcze podpowiedzi?
 
Odpowiedź
#4
A bateria w nim jest sprawna?
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(15-02-2024, 15:53)Jarewa0606 napisał(a): A bateria w nim jest sprawna?
tak, nowa, świeżo kupiona razem z modułem.

Edit.:
jak podłączyłem poprzez rezystor 10k  SCL do A5 i SDA do A4 to dostaję w Serial monitorze
Kod:
Scanning...
No I2C devices found

Edit2.:
sprawdziłem to samo z rezystorami 4.7k i mam to samo.
z tego co zrozumiałem z internetu to piny SCL i SDA w Arduino odpowiadają A5 i A4.
 
Odpowiedź
#6
To albo uwalone UNO R3 albo DS1307
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
Nie wiem co tam miałeś źle podłączone, jak masz na płytce piny oznaczone SCL I DTA od I2C to do nich też się można podłączyć, to te same piny co A4 i A5, chodzi o to by jednocześnie do A4 i A5 nic nie podłączać, bo one są połączone na płytce i to będzie się gryzło.
No jednak coś się zmieniło. Niestety nie można podłączać pod piny wyjściowe VCC czy GND bezpośrednio, gdy zamierzasz tam wystawiać sygnał cyfrowy 0/1=GND/5V, podłączasz bez rezystora 5V, uC wystawia 0, robisz zwarcie, pin leci z dymem w atmosferę. Na pinach I2C ma się pojawiać "słabe" 5V dostarczane przez rezystor z VCC, zwarciem do GND zamieniane na 0V.
Odłącz wszystko, podłącz pod piny A4 i A5 ledy, przez rezystory oczywiście, 200-500om, wgraj prosty szkic do migania na pinach A4 i A5, sprawdzisz czy jeszcze żyją.
W ogóle to nie napisałeś, czy Blink się wgrywał i działał poprawnie, zawsze przy nowej płytce, programie, konfigu należy wgrać taki prosty program, by sprawdzić na pewnym kodzie, że wszystko działa jak należy, a dopiero potem martwić się, czy masz magistralę I2C dobrze przygotowaną, adresy w bibliotece są poprawne.
Arduino to połączenie elektroniki z programowaniem, coś takiego jak multimetr to niezbędne wyposażenie, dalej analizator logiczny Saleae (klon za parę dyszek) - tu by się bardzo przydał, programator do AVR, lutownica, itp.
Na koniec, ale to jak już skanerem wykryjesz adresy na magistrali, w linku do botland masz przykład biblioteki, w Arduino IDE pewnie jeszcze parę, warto sprawdzać inne
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości