Nie działający wyświetlacz po uruchomieniu SD - damilog - 18-01-2020
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");
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?
Nie działający wyświetlacz po uruchomieniu SD - wchpikus - 18-01-2020
while (1);
}
Serial.println("Karta SD uruchomiona.");
}
Jak chcesz wyjsc z tej petli??
Wysłane z mojego SM-G950F przy użyciu Tapatalka
RE: Nie działający wyświetlacz po uruchomieniu SD - damilog - 18-01-2020
(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");
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?
Nie działający wyświetlacz po uruchomieniu SD - wchpikus - 18-01-2020
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
RE: Nie działający wyświetlacz po uruchomieniu SD - damilog - 18-01-2020
(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.
Nie działający wyświetlacz po uruchomieniu SD - wchpikus - 18-01-2020
Pokaz ta funkcje
Wysłane z mojego SM-G950F przy użyciu Tapatalka
Nie działający wyświetlacz po uruchomieniu SD - wchpikus - 18-01-2020
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
RE: Nie działający wyświetlacz po uruchomieniu SD - damilog - 18-01-2020
(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
Nie działający wyświetlacz po uruchomieniu SD - wchpikus - 18-01-2020
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
RE: Nie działający wyświetlacz po uruchomieniu SD - Agregacik - 18-01-2020
A po co średnik po tym if
"if (pozar == LOW){
tone(A1, 1000, 100);
};"
|