pripojenim ds3231 na i2c neinicializuje zbernicu

Odpovědět
minicico1
Příspěvky: 29
Registrován: 30 kvě 2019, 01:13
Reputation: 0

pripojenim ds3231 na i2c neinicializuje zbernicu

Příspěvek od minicico1 » 30 kvě 2019, 01:50

ahojte.pisem program pre radio s oled displejom na dialkove ovladanie.vsetko mi fungovalo az pokial som nechcel pridat funkciu hodin.pripojil som modul hodin k i2c zbernici na ktorej mi uz funguje modul radia si4703 a oled displej.akonahle v programe odkomentujem inicializaciu modulu hodin a nahram do arduina program sa akoby sekne pri inicializacii komunikacie i2c a koniec.ked nahram len skec hodin tak tie funguju.
tu je kod:

Kód: Vybrat vše

#include <Adafruit_SSD1306.h>
#include <IRremote.h>
#include <SparkFunSi4703.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <avr/power.h>
#include <SPI.h>
#define OLED_RESET LED_BUILTIN  //4
#include <DS3231.h>

Adafruit_SSD1306 display(OLED_RESET);
DS3231 clock;
RTCDateTime dt;


const int resetPin = 12;
const int SDIO = A4;
const int SCLK = A5;
Si4703_Breakout radio(resetPin, SDIO, SCLK);
const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
int volume;
float channel;



  



void setup(){
  
  pinMode(2,INPUT_PULLUP);
  irrecv.enableIRIn();
  irrecv.blink13(true);
  
 
  Serial.begin(9600);
  pinMode(11,OUTPUT);
  analogReference(INTERNAL);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  //clock.begin();
  
  radio.powerOn();
  radio.setVolume(3); 
    
}

void loop()
{

digitalWrite(11,LOW);


  

  int analogvalue = analogRead(A0);
  {Serial.println(analogvalue);
  delay (1000);}
  if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;
delay(100);
        switch(results.value){
         
          case 0xFFE21D:
        channel =  radio.seekUp();
        
          break;
          
          case 0xFFA25D:
        channel =  radio.seekDown();
        
          break;  

          
          case 0xFFA857:
          volume ++;
          if (volume == 16) volume = 15;
          radio.setVolume(volume);
          
          break;

          case 0xFFE01F:
          volume --;
          if (volume < 0) volume = 0;
          radio.setVolume(volume);
          
          break;

          case 0xFF30CF:
          radio.setChannel(943);
          channel = 943;
          break;
          
          case 0xFF18E7:
          radio.setChannel(966);
          channel = 966;
          break;

          case 0xFF7A85:
          radio.setChannel(884);
          channel = 884;
          break;

          case 0xFF10EF:
          radio.setChannel(1048);
          channel = 1048;
          break;

          case 0xFF38C7:
          radio.setChannel(930);
          channel = 930;
          break;

          case 0xFFC23D:
        display.clearDisplay();
  
  display.display();
        
    
          digitalWrite(11,HIGH);                      // vypnutie mosfetu
          
        
          
          
          break;
          
        }
        key_value = results.value;
        irrecv.resume(); 
  }

    display.setTextSize(1);
    display.setTextColor(WHITE); 
    display.setCursor(0,0);
    display.println("VOLUME");
    display.setCursor(45,0);
    display.println(volume);
    display.setCursor(0,12);
    display.println("kanal");
    display.setCursor(70,12);
    display.println(channel/10);
    display.setCursor(110,12);
    display.println("Mhz");
    if(analogvalue>300){
    display.drawLine(105, 2, 105, 5, WHITE);}
    if(analogvalue>330){
    display.drawLine(110, 2, 110, 5, WHITE);} 
    if(analogvalue>360){
    display.drawLine(115, 2, 115, 5, WHITE);}  
    if(analogvalue>390){
    display.drawLine(120, 2, 120, 5, WHITE);}
    
    if(analogvalue<=299){
    display.setTextSize(2);  
    display.setCursor(20,25);
    display.println("LOW BAT");
    }  
    
    else if(channel == 943){
    display.setTextSize(2);  
    display.setCursor(15,25);
    display.println("FUNRADIO");  
    }
    
    else if(channel == 966){
    display.setTextSize(2);  
    display.setCursor(0,25);
    display.println("RAD.SLOVENSKO");  
    }
    
    else if(channel == 884){
    display.setTextSize(2);  
    display.setCursor(20,25);
    display.println("EXPRES");  
    }
    
    else if(channel == 1048){
    display.setTextSize(2);  
    display.setCursor(15,25);
    display.println("EUROPA 2");  
    }
    
    else if(channel == 930){
    display.setTextSize(2);  
    display.setCursor(15,25);
    display.println("BEST FM");  
    }
    
    display.drawRect(100,0,25,8, WHITE);  
    display.drawRect(125,3,8,2, WHITE);
    display.setTextSize(1);
    display.setCursor(75,0);
    display.println("BAT");
    display.drawLine(0, 10, 128, 10, WHITE);
    display.display();
    display.clearDisplay();

}





  
   
   


commar
Příspěvky: 31
Registrován: 26 úno 2019, 15:20
Reputation: 0

Re: pripojenim ds3231 na i2c neinicializuje zbernicu

Příspěvek od commar » 30 kvě 2019, 11:56

Asi bych začal zjištěním adres zařízení, jestli není něco v konfliktu a jsou dostupné.
I2C scanner je tad yhttps://playground.arduino.cc/Main/I2cScanner/.

minicico1
Příspěvky: 29
Registrován: 30 kvě 2019, 01:13
Reputation: 0

Re: pripojenim ds3231 na i2c neinicializuje zbernicu

Příspěvek od minicico1 » 30 kvě 2019, 13:26

Scaner uz som skusal a najde mi vsetky i2c moduly.kazdy s inou adresou, takze adresami by to nemalo byt.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: pripojenim ds3231 na i2c neinicializuje zbernicu

Příspěvek od jankop » 30 kvě 2019, 13:58

Sběrnice I2C předpokládá pullup rezistory na SCL a SDA. Jejich běžná hodnota je cca 4k7. Výrobci naprosto běžně dávají na své moduly tyto rezistory. Když propojíš několik těchto modulů na jednu sběrnici, pak může vzniknout problém, že výsledný odpor daný paralelním zapojením všech těchto pullup rezistorů bude příliš nízký a některý z modulů už nemusí fungovat správně. Doporučuji identifikovat na všech I2C modulech SCL a SDA a podívat se, jaké rezistory tam jsou a případně některé vypojit. Bývají tam často i propojky na plošném spoji na přeškrabání. V principu, při krátkých vodičích a kmitočtu 100kHz, by měl stačit jeden jediný pár rezistorů 4k7.

minicico1
Příspěvky: 29
Registrován: 30 kvě 2019, 01:13
Reputation: 0

Re: pripojenim ds3231 na i2c neinicializuje zbernicu

Příspěvek od minicico1 » 06 čer 2019, 10:10

Dakujem, s tymi rezistormi by ma to veru nenapadlo..s 3mi modulmi uz je ten vysledmy odpor dost nizky.este som sa k tomu nedostal.zatial som robil bez modulu hodin.neviem si ale dat rady este s jednym problemom a to ze by som chcel radio dialkovym vypnut do standby rezimu v ktorom by mi mosfet vypol napajanie modulov a arduino by mi uspal.interrupt mam nastaveny na vystup z Ir prijimaca.ked stlacim hociktore tlacitko na dialkovom zmeni sa mi vystup z prijimaca z high na low a opacne a to mi prebudi arduino.funguje to az na to ze mi po prebudeni nenabehne komunikacia i2c.niekde na cudzojazycnych forach som sa docital ze po prebudeni kniznica najprv zahaji komunikaciu a az potom pride k inicializacii pinu na high ktory mi zapina mosfet.ked moduly neodpajam mosfetom uspavanie aj prebudenie funguje.potreboval by som na zaciatku v loop skontrolovat komunikaciu a ak nenabehla vykonat ju a dalej pokracovat v programe.skusal som uz vselico ale nic mi nefungovalo

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů