Arduino Polska Forum

Pełna wersja: Nie działający wyświetlacz po uruchomieniu SD
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Witam. Mam problem z kodem (lub czymś innym).
Postanowiłem zrobić czujnik wilgotności i temperatury z zapisem wartości na SD. Niestety po inicjalizacji karty w pętli LOOP wyświetlacz zamiera i nic nie wyświetla a na karcie dane nie są zapisywane. Jedynie serial monitor pokazuje że karta SD jest odpalona. Dodam też że wszystkie przykłady dla SD działają i zapisują dane na karcie jak i wyświetlają w Serial Monitorze.
Moduł SD to HW 125 a wyświetlacz to OLED na I2C. Do tego Buzzer i czunik ognia oraz zegarek HW 111. I wszystko z nimi jest ok do czasu odpalenia 
Kod:
File plik = SD.open("pomiar.txt", FILE_WRITE);
Kod:
  plik.print("otwarte");
Kod:
  plik.print("zamkniete");
Kod:
  plik.close();


Całość kodu wygląda tak:
Kod:
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <OneWire.h>
#include <Wire.h>

Adafruit_SSD1306 display(4);
//wyświetlacz koniec
//sensor ciśnienia i temperatury
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C
//unsigned long delayTime;
//sensor ciśnienia i temperatury koniec

//zegar rtc

#define DS1307_ADDRESS 0x68 //adres zegara
RTC_Millis RTC;
//zegar rtc koniec


int year;
int ogien = A3; //ustawienie zmiennej do czujnika ognia
int BUZZER = A1; // SYGNAŁ DLA BUZER
int wilgotnosc;
byte pozar;
char dt[8];  //ustawić zmienne dla zegarka dt

const int chipSelect = 4;

void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
display.clearDisplay();
//ustawienie adresu I2C dla sensora temp i ciśnienia
unsigned status;
status = bme.begin(0x76);
//sensor ciśnienia i temperatury koniec
//zegar
RTC.begin(DateTime(__DATE__, __TIME__));
//koniec zegar

pinMode(ogien, INPUT);  //ustawienie portu czujnika ognia
pinMode(A1, OUTPUT);
 
  Serial.begin(9600);
  while (!Serial) {
    ;
  }


  Serial.println("Inicjowanie kardty SD ...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
   
    while (1);
  }
  Serial.println("Karta SD uruchomiona.");
}

void loop() {
 


  File plik = SD.open("pomiar.txt", FILE_WRITE);
  plik.print("otwarte");
  plik.print("zamkniete");
  plik.close();
   
DateTime now =  RTC.now();

  pozar = digitalRead(ogien);
if (pozar == LOW){
tone(A1, 1000, 100);
}; //koniec instrukcji alarmu pożaru

//wyswietlacz
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);


//data i godzina
display.setCursor(4,3);
display.println(now.year());
display.setCursor(29,3);
display.println("-");
display.setCursor(35,3);
display.println(now.month());
display.setCursor(49,3);
display.println("-");
display.setCursor(54,3);
display.println(now.day(), DEC);
display.setCursor(72,3);
display.println(now.hour(), DEC);
display.setCursor(82,3);
display.println(":");
display.setCursor(88,3);
display.println(now.minute(), DEC);
display.setCursor(99,3);
display.println(":");
display.setCursor(104,3);
display.println(now.second(), DEC);
//koniec daty i godziny


display.setCursor(4,12);
display.println("TEMP");
display.setCursor(50,12);
display.println(bme.readTemperature());
display.setCursor(85,12);
display.println("C");


display.setCursor(4,21);
display.println("WILGOTNOSC");
display.setCursor(70,21);
display.println(bme.readHumidity());
display.setCursor(105,21);
display.println("%");

display.drawRect(1, 1, 126, 30, WHITE);
display.display();
delay(1000);
display.clearDisplay();
//koniec wyswietlacza


 
}
Wiem że kod nie jest najlepszy ale może coś poradzicie?
while (1);
  }
  Serial.println("Karta SD uruchomiona.");
}


Jak chcesz wyjsc z tej petli??

Wysłane z mojego SM-G950F przy użyciu Tapatalka
(18-01-2020, 14:07)wchpikus napisał(a): [ -> ]while (1);
  }
  Serial.println("Karta SD uruchomiona.");
}


Jak chcesz wyjsc z tej petli??

Wysłane z mojego SM-G950F przy użyciu Tapatalka

Też racja. Jednak to nie jest problem tego czegoś. wyświetlacz nadal się nie włącza.

poprawiony kod:
Kod:
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <OneWire.h>
#include <Wire.h>

Adafruit_SSD1306 display(4);
//wyświetlacz koniec
//sensor ciśnienia i temperatury
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C
//unsigned long delayTime;
//sensor ciśnienia i temperatury koniec

//zegar rtc

#define DS1307_ADDRESS 0x68 //adres zegara
RTC_Millis RTC;
//zegar rtc koniec


int year;
int ogien = A3; //ustawienie zmiennej do czujnika ognia
int BUZZER = A1; // SYGNAŁ DLA BUZER
int wilgotnosc;
byte pozar;
char dt[8];  //ustawić zmienne dla zegarka dt

const int chipSelect = 4;

void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
display.clearDisplay();
//ustawienie adresu I2C dla sensora temp i ciśnienia
unsigned status;
status = bme.begin(0x76);
//sensor ciśnienia i temperatury koniec
//zegar
RTC.begin(DateTime(__DATE__, __TIME__));
//koniec zegar

pinMode(ogien, INPUT);  //ustawienie portu czujnika ognia
pinMode(A1, OUTPUT);
 
  Serial.begin(9600);



  Serial.println("Inicjowanie kardty SD ...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
 
  }
  Serial.println("Karta SD uruchomiona.");
}

void loop() {
 


  File plik = SD.open("pomiar.txt", FILE_WRITE);
  plik.print("otwarte");
  plik.print("zamkniete");
  plik.close();
  
DateTime now =  RTC.now();

  pozar = digitalRead(ogien);
if (pozar == LOW){
tone(A1, 1000, 100);
}; //koniec instrukcji alarmu pożaru

//wyswietlacz
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);


//data i godzina
display.setCursor(4,3);
display.println(now.year());
display.setCursor(29,3);
display.println("-");
display.setCursor(35,3);
display.println(now.month());
display.setCursor(49,3);
display.println("-");
display.setCursor(54,3);
display.println(now.day(), DEC);
display.setCursor(72,3);
display.println(now.hour(), DEC);
display.setCursor(82,3);
display.println(":");
display.setCursor(88,3);
display.println(now.minute(), DEC);
display.setCursor(99,3);
display.println(":");
display.setCursor(104,3);
display.println(now.second(), DEC);
//koniec daty i godziny


display.setCursor(4,12);
display.println("TEMP");
display.setCursor(50,12);
display.println(bme.readTemperature());
display.setCursor(85,12);
display.println("C");


display.setCursor(4,21);
display.println("WILGOTNOSC");
display.setCursor(70,21);
display.println(bme.readHumidity());
display.setCursor(105,21);
display.println("%");

display.drawRect(1, 1, 126, 30, WHITE);
display.display();
delay(1000);
display.clearDisplay();
//koniec wyswietlacza


 
}

Wywaliłem z kodu linijki 
Kod:
  File plik = SD.open("pomiar.txt", FILE_WRITE);
Kod:
  plik.print("otwarte");
Kod:
  plik.print("zamkniete");
Kod:
  plik.close();

 i zamieniłem na (na końcu kodu)
Kod:
int minuty = now.minute();
if (minuty == 930){

  File plik = SD.open("pomiar.txt", FILE_WRITE);
  plik.write(bme.readHumidity());
  plik.write("%  ;");
  plik.close();
}
 w przypadku gdy dla warunku IF ustawie sensowne wartości jak np 30 itp to wyświetlacz przestaje reagować a jak warunki są jakieś kosmiczne nie do spełnienia to wszystko działa.  Macie jakieś propozycje?
Sprawdzaj po kolei na ktorej funkcji staje..mozesz dodac cos na uart,bys widzial ze wchodzi do funkcji.
Nie widze co robi polowa funkcji w rwo8m kodzie..

Wysłane z mojego SM-G950F przy użyciu Tapatalka
(18-01-2020, 14:59)wchpikus napisał(a): [ -> ]Sprawdzaj po kolei na ktorej funkcji staje..mozesz dodac cos na uart,bys widzial ze wchodzi do funkcji.
Nie widze co robi polowa funkcji w rwo8m kodzie..

Wysłane z mojego SM-G950F przy użyciu Tapatalka

Już pisze. W momencie pojawienia się 
Kod PHP:
  File plik SD.open("pomiar.txt"FILE_WRITE); 

wszystko staje w miejscu

reszta funkcji to wyświetlanie danych na OLED i uruchomienie alarmu w przypadku zadziałania czujnika ognia. Nic wielkiego,  do tego ustawienie portów I2C  dla wyświetlacza i czujnika temperatury i takie sprawy konfiguracyjne.
Pokaz ta funkcje

Wysłane z mojego SM-G950F przy użyciu Tapatalka
Wydaje mi sie ze prosciej bedzie tak jak w tym przykladzie.
Cos masz kolejnosc nie taka..
Sprawdz czy odczyt karty zwroci cokolwiek.

https://www.arduino.cc/en/Tutorial/ReadWrite

Nie masz przed setup zdeklarowanego file.
Lepiej sprawdzaj czy jest plik czy nie, funkcja zwraca false lub true.
Tak jak robisz teraz,nie wiesz co jest zwracane...

Wysłane z mojego SM-G950F przy użyciu Tapatalka
(18-01-2020, 15:58)wchpikus napisał(a): [ -> ]Wydaje mi sie ze prosciej bedzie tak jak w tym przykladzie.
Cos masz kolejnosc nie taka..
Sprawdz czy odczyt karty zwroci cokolwiek.

https://www.arduino.cc/en/Tutorial/ReadWrite

Nie masz przed setup zdeklarowanego file.
Lepiej sprawdzaj czy jest plik czy nie, funkcja zwraca false lub true.
Tak jak robisz teraz,nie wiesz co jest zwracane...

Wysłane z mojego SM-G950F przy użyciu Tapatalka

Jak załaduje ten przykład co podałeś to wszystko smiga jeśli chodzi o karte SD. Oczywiście na serial monitor wszystko ładnie wyświetli i zapisze na karcie SD .
Postanowiłem do tego kodu dodać resztę z mojego kodu i na karcie SD zapisze wszystko ładnie ale OLED podpięty na I2C nadal nie wyświetla NIC.
Stworzyłem takiego potworka:
Kod:
#include <Wire.h>
// wyświetlacz
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(4);
//wyświetlacz koniec
//sensor ciśnienia i temperatury
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C
//unsigned long delayTime;
//sensor ciśnienia i temperatury koniec

//zegar rtc
#include <RTClib.h>
#define DS1307_ADDRESS 0x68 //adres zegara
RTC_Millis RTC;
//zegar rtc koniec
#include <OneWire.h>
int year;
int ogien = A3; //ustawienie zmiennej do czujnika ognia
int BUZZER = A1; // SYGNAŁ DLA BUZER
int wilgotnosc;
byte pozar;
char dt[8];  //ustawić zmienne dla zegarka dt


/*
  SD card read/write

This example shows how to read and write data to and from an SD card file   
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created   Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.
   
*/

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
display.clearDisplay();
//ustawienie adresu I2C dla sensora temp i ciśnienia
unsigned status;
status = bme.begin(0x76);
//sensor ciśnienia i temperatury koniec
//zegar
RTC.begin(DateTime(__DATE__, __TIME__));
//RTC.begin();
//koniec zegar

pinMode(ogien, INPUT);  //usawienie portu czujnika ognia
pinMode(A1, OUTPUT);

 
 
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
  // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
 
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }


}

void loop()
{
 
  DateTime now =  RTC.now();
//czujnik ognia
  pozar = digitalRead(ogien);
if (pozar == LOW){
tone(A1, 1000, 100);
}; //koniec instrukcji czujnika ognia


myFile = SD.open("test.txt", FILE_WRITE);
myFile.println("data: ");                                         //zapisz wartość
myFile.print(now.year());                                         //zapisz wartość roku
myFile.print("-");                                         //zapisz wartość
myFile.print(now.month());                                         //zapisz wartość miesiąca 
myFile.print("-");                                         //zapisz wartość   
myFile.print(now.day());                                         //zapisz wartość dnia
myFile.print(" godzina: ");                                         //zapisz wartość   
myFile.print(now.hour());                                         //zapisz wartość godziny   
myFile.print(":");                                         //zapisz wartość 
myFile.print(now.minute());                                         //zapisz wartość minuty 
myFile.print(":");                                         //zapisz wartość   
myFile.print(now.second());                                         //zapisz wartość sekundy
myFile.print("temperatura: ");                                         //zapisz wartość     
myFile.print(bme.readTemperature());                                         //zapisz wartość temperatury   
myFile.print("wilgotnosc: ");                                         //zapisz wartość 
myFile.print(bme.readHumidity());                                         //zapisz wartość wilgotności   
       
myFile.close();                                            //zamknij/zapisz plik
//delay(300);                                              //oczekaj 0,3s
//Serial.println("Zapisano !");                            //poinformuj o zapisaniu pliku
/*koniec SD */

//wyswietlacz
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(4,3);
display.println(now.year());
display.setCursor(29,3);
display.println("-");
display.setCursor(35,3);
display.println(now.month());
display.setCursor(49,3);
display.println("-");
display.setCursor(54,3);
display.println(now.day(), DEC);
display.setCursor(72,3);
display.println(now.hour(), DEC);
display.setCursor(82,3);
display.println(":");
display.setCursor(88,3);
display.println(now.minute(), DEC);
display.setCursor(99,3);
display.println(":");
display.setCursor(104,3);
display.println(now.second(), DEC);
display.setCursor(4,12);
display.println("TEMP");
display.setCursor(50,12);
display.println(bme.readTemperature());
display.setCursor(85,12);
display.println("C");
display.setCursor(4,21);
display.println("WILGOTNOSC");
display.setCursor(70,21);
display.println(bme.readHumidity());
display.setCursor(105,21);
display.println("%");
display.drawRect(1, 1, 126, 30, WHITE);
display.display();
delay(1000);
display.clearDisplay();
//koniec wyswietlacza

 
                       


}

Wiem że kod poplątany ale na razie tym prototypem sie bawię i kiedyś przyjdzie czas na porządne komentarze i ogarnięcie bałaganu
A jak masz podlaczony oled i karte?
Karta pracuje na spi, a twoj oled?
Tez?


Wysłane z mojego SM-G950F przy użyciu Tapatalka
A po co średnik po tym if
"if (pozar == LOW){
tone(A1, 1000, 100);
};"
Stron: 1 2 3