Skocz do zawartości

Brak odczytu z czujnika gestów APDS9960 Adafruit .


Wiktor2019

Pomocna odpowiedź

Ostatnim razem opisywałem na forum mój termometr. Wymyśliłem sobie, żeby po przesunięciu ręki w prawo był następny ekran a jak w lewo to poprzedni ekran. Do ostatniego programu dołożyłem kod obsługujący czujnik, program opierający się na zmiennej. Problem jest w tym, że czujnik wychwytuje co któryś  mój ruch ręki.  Program miał działać tak, że jeśli czujnik wykryje ruch ręki w prawo to zmienna (ekran) + 1 a jeśli ruch ręki w lewo to zmienna - 1 i w zależności od zmiennej taki jest wyświetlany ekran. Specyfikacja czujnika APDS9960 Adafruit. Wiem, że kod nie jest poukładany i najlepszy ale proszę nie zwracać na to uwagi. Poniżej kod:

#include <Wire.h>
#include "i2c.h"
#include "Wire.h"
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIR 12
#include <TroykaDHT.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;


//dni tygodnia
char daysOfTheWeek[7][12] = {"ndz", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"};

// Temperatury maksymalne i ninimalne
int tempmin1 = 100;
int tempmax1 = 1;
int tempmin2 = 100;
int tempmax2 = 1;
int tempmin3 = 100;
int tempmax3 = 1;


//dht22/11
DHT dht1(10, DHT22);
DHT dht2( 6, DHT22);
DHT dht3( 2, DHT11);

//ds18b20
#define ONE_WIRE_BUS1 7 
OneWire oneWire1(ONE_WIRE_BUS1); 
DallasTemperature sensors1(&oneWire1); 

// Ustawienie adresu ukladu na 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);   

int ekran = 0;

//Tworzenie znaków
byte stopnie[8] = {
  0b01110,
  0b01010,
  0b01110,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

byte innea[8] = {
  B01110,
  B10001,
  B10001,
  B11111,
  B10001,
  B10001,
  B00010,
  B00001
};

byte innes[8] = {
  B00010,
  B00100,
  B01110,
  B10000,
  B01110,
  B00001,
  B11110,
  B00000
};

byte innec[8] = {
  B00010,
  B00100,
  B01110,
  B10000,
  B10000,
  B10001,
  B01110,
  B00000
};

byte tempMAX [8] = {
  0b00100,
  0b01110,
  0b10101,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100
};

byte tempMIN[8] = {
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b00100,
  0b10101,
  0b01110,
  0b00100
};

void setup(){
  Serial.begin(115200);
  
//LCD
    lcd.init(); 
    lcd.backlight(); 
    lcd.begin(20, 4);
    
//apds9960    
     if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  
  apds.enableProximity(true);
  apds.enableGesture(true);
    
//komunikat RTC w razie braku moduł
    if (! rtc.begin()) {
    lcd.setCursor(0,0 );
    lcd.print("Nie znaleziono RTC");
    delay(1500);
    lcd.noBacklight(); 
    lcd.clear();
    }
    
//ustawianie czasu w pamkięci RTC
  if (rtc.lostPower()) {
  //ustawianie czasu  podczas komplikacji
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   //ustawianie casu ręcznie rok-miesiąc-dzień-godzina-minuty-numer dnia tygodnia
   //rtc.adjust(DateTime(2025, 10, 4, 14, 57, 6));
  }
//przycisk do zmiany czasu
    pinMode(11, INPUT_PULLUP);
    pinMode(8, INPUT);
  
//dht22
    dht1.begin();
    dht2.begin();
    dht3.begin();
  
//czujnik ruchu
    pinMode(PIR, INPUT); //PIR jako wejście
    pinMode(13, OUTPUT);

//Rozpoczęcie pracy Ds18B20
    sensors1.begin(); 

}

void loop(){

//Tworzenie znaków
     lcd.createChar(0, stopnie);
     lcd.createChar(1, innea);
     lcd.createChar(2, innes);
     lcd.createChar(3, innec);
     lcd.createChar(4, tempMAX);
     lcd.createChar(5, tempMIN);

  //ustawianie zegara
     DateTime now = rtc.now();

// czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();


  if (czasletni == 23){
    if (minuty  == 5){
 tempmin1 = 100;
 tempmax1 = 1;
 tempmin2 = 100;
 tempmax2 = 1;
 tempmin3 = 100;
 tempmax3 = 1;
  }} else{
  
  // na zewnatrz
  if(tempmin1>sensors1.getTempCByIndex(0)){
     tempmin1 = sensors1.getTempCByIndex(0);
  }
  if(sensors1.getTempCByIndex(0)>tempmax1 & sensors1.getTempCByIndex(0) < 50){
      tempmax1 = sensors1.getTempCByIndex(0);
  }
 
// w tym pokoju
     dht1.read();
     switch(dht1.getState()) {
     case DHT_OK:
  if(dht1.getTemperatureC()<tempmin2){
      tempmin2 = dht1.getTemperatureC();
      }
      if(dht1.getTemperatureC()>tempmax2){
      tempmax2 = dht1.getTemperatureC();
      }}
      
// na dole
     dht2.read();
     switch(dht2.getState()) {
     case DHT_OK:
  if(dht2.getTemperatureC()<tempmin3){
      tempmin3 = dht2.getTemperatureC();
  }
  if(dht2.getTemperatureC()>tempmax3){
     tempmax3 = dht2.getTemperatureC();
   }}}
   
   

uint8_t gesture = apds.readGesture();
    
 if(gesture == APDS9960_RIGHT) {
   ekran++;
 }
 
 if(gesture == APDS9960_LEFT){
   ekran--;
 }
if (ekran == 0){ 
  //Lcd pusty ekran
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print(" ");
}

if (ekran == 1){
//czas i data
  if (digitalRead(11) == HIGH){
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czasletni);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }else{
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czaszimowy);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }
}

if (ekran == 2){
//Na zewnątrz
     lcd.clear();
     dht3.read();
     switch(dht3.getState()) {
     case DHT_OK:
     sensors1.requestTemperatures();    
     lcd.setCursor(5,0);
     lcd.print("NA ZEWN");
     lcd.write(byte(1));
     lcd.print("TRZ");
     lcd.setCursor(0, 1);//
     lcd.print("Temperatura ");
     lcd.print(sensors1.getTempCByIndex(0)); 
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0, 2);
     lcd.print("Wilgotno");
     lcd.write(byte(2));
     lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(dht3.getHumidity());
     lcd.print("%");
     lcd.setCursor(0, 3);
     lcd.print(" ");
     }
// na zewnatrz
  if(tempmin1>sensors1.getTempCByIndex(0)){
     tempmin1 = sensors1.getTempCByIndex(0);
  }
  if(sensors1.getTempCByIndex(0)>tempmax1 & sensors1.getTempCByIndex(0) < 50){
      tempmax1 = sensors1.getTempCByIndex(0);
  }
}

if (ekran == 3){
  //W tym pokoju
     lcd.clear();     
     dht1.read();
     switch(dht1.getState()) {
     case DHT_OK:
     lcd.setCursor(4,0);
     lcd.print("W TYM POKOJU"); 
     lcd.setCursor(0, 1);
     lcd.print("Temperatura "); 
     lcd.print(dht1.getTemperatureC());
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0,2); 
     lcd.print("Wilgotno");
     lcd.write(byte(2));
     lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(dht1.getHumidity());
     lcd.print(" %");
     lcd.setCursor(0, 3);
     lcd.print(" ");
  if(dht1.getTemperatureC()<tempmin2){
      tempmin2 = dht1.getTemperatureC();
  }
  if(dht1.getTemperatureC()>tempmax2){
      tempmax2 = dht1.getTemperatureC();
  }}
}
 
 if (ekran == 4){   
//Na dole
     lcd.clear();     
     dht2.read();
     switch(dht2.getState()) {
     case DHT_OK:
     lcd.setCursor(7,0);
     lcd.print("Na DOLE");
     lcd.setCursor(0, 1);
     lcd.print("Temperatura "); 
     lcd.print(dht2.getTemperatureC());
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0,2); 
     lcd.print("Wilgotno");
     lcd.write(byte(2));
     lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(dht2.getHumidity());
     lcd.print(" %");
     lcd.setCursor(0, 3);
     lcd.print(" ");
  if(dht2.getTemperatureC()<tempmin3){
      tempmin3 = dht2.getTemperatureC();
  }
  if(dht2.getTemperatureC()>tempmax3){
      tempmax3 = dht2.getTemperatureC();
  }}
}

if (ekran == 5){
//LCD różnice temperatur
     lcd.clear();
     lcd.setCursor(5,0);
     lcd.print("NA ZEWN");
     lcd.write(byte(1));
     lcd.print("TRZ");
     lcd.setCursor(0, 1);
     lcd.print("T");
     lcd.write(byte(5));
     lcd.write(byte(4));
     lcd.print(" ");
     lcd.print(tempmin1);
     lcd.write(byte(0));
     lcd.print("C");
     lcd.print(" ");
     lcd.print(tempmax1);
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(4, 2);
     lcd.print("W TYM POKOJU"); 
     lcd.setCursor(0, 3);
     lcd.print("T");
     lcd.write(byte(5));
     lcd.write(byte(4));
     lcd.print(" ");
     lcd.print(tempmin2);
     lcd.write(byte(0));
     lcd.print("C");
     lcd.print(" ");
     lcd.print(tempmax2);
     lcd.write(byte(0));
     lcd.print("C");
}

if (ekran == 6){
//LCD różnice temperatur - 2
     lcd.clear();
     lcd.setCursor(7,0);
     lcd.print("Na DOLE");
     lcd.setCursor(0, 1);
     lcd.print("T");
     lcd.write(byte(5));
     lcd.write(byte(4));
     lcd.print(" ");
     lcd.print(tempmin3);
     lcd.write(byte(0));
     lcd.print("C");
     lcd.print(" ");
     lcd.print(tempmax3);
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print(" ");
   }
   if (ekran == 7) {
     ekran = 0;
   }
}

 

Edytowano przez Wiktor2019
Zły link
Link do komentarza
Share on other sites

Twój program jest dość nieczytelny, tworzenie ogromnej pętli loop nie jest najlepszym pomysłem -  dla poprawy czytelności możesz wydzielić fragmenty o podobnej logice/funkcjonalności i umieścić je w osobnych funkcjach, strukturach, a nawet klasach. Też powtarzalne fragmenty z obsługą wyświetlacza bardzo rozszerzają długość kodu - możesz je zwinąć do funkcji.

Skąd brak odczytu? Zgaduję że coś powoduje opóźnienia (np. odczyt z innych czujników) i wykrywanie gestów załącza się w nie tym momencie co trzeba. Tu możesz tymczasowo wyłączyć z kodu niektóre funkcje i sprawdzić która generuje problemy (tu właśnie dobrze napisany kod z podziałem na funkcje byłby pomocny 😉 ).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Wiem, że mój program jest nieczytelny ale jak pisałeś:

Cytat

dla poprawy czytelności możesz wydzielić fragmenty o podobnej logice/funkcjonalności i umieścić je w osobnych funkcjach, strukturach, a nawet klasach. 

to czy dobrze rozumiem, że lepiej byłoby gdybym podzielił kod np. tak:

void zegar() {
  // czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();
  
        if (digitalRead(11) == HIGH){
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czasletni);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }else{
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czaszimowy);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }}

i tak dalej z kolejnymi ekranami. Oraz czy pokazał byś przykład jak skrócić kod z ekranami ponieważ nie mam wiedzy jak to zrobić?

 

Usunąłem niektóre funkcje z kodu i wiem, że przez odczyt z czujników temperatury i wilgotności  nie działa odczyt z czujnika gestów bo jeśli niema odczytu z czujników to czujnik gestów działa. Oraz jeśli jest na ekranie włączy się ekran z odczytem z czujników to ekran cały czas mruga (odświeża się) i nie da się nic przeczytać czy wiesz jak temu zaradzić? Poniżej mój kod:

#include<Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIR 12
#include <TroykaDHT.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

int zmienna;

//dht22/11
DHT dht1(10, DHT22);
DHT dht2( 6, DHT22);
DHT dht3( 2, DHT11);

//ds18b20
#define ONE_WIRE_BUS1 7 
OneWire oneWire1(ONE_WIRE_BUS1); 
DallasTemperature sensors1(&oneWire1); 

//dni tygodnia
char daysOfTheWeek[7][12] = {"ndz", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"};

// Ustawienie adresu ukladu na 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);

// the setup function runs once when you press reset or power the board
void setup() {
    Serial.begin(115200);
    
    //dht22
    dht1.begin();
    dht2.begin();
    dht3.begin();
    
//Rozpoczęcie pracy Ds18B20
    sensors1.begin(); 

    //przycisk do zmiany czasu
    pinMode(11, INPUT_PULLUP);
    pinMode(8, INPUT);
    
  //LCD
 lcd.init();
  lcd.backlight(); 
    lcd.begin(20, 4);

  //komunikat RTC w razie braku moduł
    if (! rtc.begin()) {
    lcd.setCursor(0,0 );
    lcd.print("Nie znaleziono RTC");
    delay(1500);
    lcd.noBacklight(); 
    lcd.clear();
    }  
//ustawianie czasu w pamkięci RTC
  if (rtc.lostPower()) {
  //ustawianie czasu  podczas komplikacji
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   //ustawianie casu ręcznie rok-miesiąc-dzień-godzina-minuty-numer dnia tygodnia
   //rtc.adjust(DateTime(2025, 10, 4, 14, 57, 6));
  }
  
  if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  //gesture mode will be entered once proximity mode senses something close
  apds.enableProximity(true);
  apds.enableGesture(true);
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {
    //ustawianie zegara
     DateTime now = rtc.now();

// czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();

  if (zmienna == 0) {
     //Lcd pusty ekran
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print("00 ");
  }
    if (zmienna == 1) {
      lcd.clear();
      if (zmienna <= 1){
     dht3.read();
     switch(dht3.getState()) {
     case DHT_OK:
     sensors1.requestTemperatures();    
     lcd.setCursor(5,0);
     lcd.print("NA ZEWN");
     lcd.write(byte(1));
     lcd.print("TRZ");
     lcd.setCursor(0, 1);//
     lcd.print("Temperatura ");
     lcd.print(sensors1.getTempCByIndex(0)); 
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0, 2);
     lcd.print("Wilgotno");
     lcd.write(byte(2));
     lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(dht3.getHumidity());
     lcd.print("%");
     lcd.setCursor(0, 3);
     lcd.print(" ");
  }}}
    if (zmienna == 2) {
     //Lcd pusty ekran
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print("22 ");
  }
    if (zmienna == 3) {
    //W tym pokoju
     lcd.clear();     
     dht1.read();
     switch(dht1.getState()) {
     case DHT_OK:
     lcd.setCursor(4,0);
     lcd.print("W TYM POKOJU"); 
     lcd.setCursor(0, 1);
     lcd.print("Temperatura "); 
     lcd.print(dht1.getTemperatureC());
     lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0,2); 
     lcd.print("Wilgotno");
     lcd.write(byte(2));
     lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(dht1.getHumidity());
     lcd.print(" %");
     lcd.setCursor(0, 3);
     lcd.print(" ");
  }}
  if (zmienna == 4){
      if (digitalRead(11) == HIGH){
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czasletni);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }else{
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czaszimowy);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }
  }
  
  if (zmienna == 5){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print("55 ");
  }
    if (zmienna == 6){
        lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print("66 ");
    }
    
        if (zmienna == 7){
    lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(" " );
     lcd.setCursor(0, 1);
     lcd.print(" ");
     lcd.setCursor(0, 2);
     lcd.print(" ");
     lcd.setCursor(0, 3);
     lcd.print("77 ");
    }
    

  //read a gesture from the device
    uint8_t gesture = apds.readGesture();
    if(gesture == APDS9960_DOWN) Serial.println("v"); 
    if(gesture == APDS9960_UP) Serial.println("^");
    if(gesture == APDS9960_LEFT){  zmienna--; Serial.println(zmienna);}
    if(gesture == APDS9960_RIGHT){  zmienna++; Serial.println(zmienna);}

   }

 

Edytowano przez Wiktor2019
Link do komentarza
Share on other sites

39 minut temu, Wiktor2019 napisał:

lepiej byłoby gdybym podzielił kod np. tak:

Lepiej by było, abyś zapoznał się z paroma umilającymi życie funkcjami - np. sprintf:

char bufor[17];
sprintf(bufor,"02d:%02d %02d.%02d.%04d", hour, minute, day, month, year);
lcd.print(bufor);

Porządkowanie kodu nie polega na przeniesieniu śmieci w inne miejsce (podobnie jak porządkowanie pokoju nie polega na wymieceniu smieci z dywanu pod łóżko).

Nie rób jednego wielkiego rozgałęzionego ifa, użyj funkcji, przykładowo:

switch(zmienna) {
  case 1:
    czysc_ekran();
    break;
    
  case 2:
    wypisz_date();
    break;
    // ... i tak dalej
      

i gdzieś potem (albo lepiej przedtem, przed loop) umieść sobie funkcje typu:
 

void wypisz_date(void)
{
	lcd.clear();
    // i tu kod wypisujący datę
}

Oprócz dużo czytelniejszego kodu masz tu jeszcze jeden ciekawy efekt uboczny: jeśli podejrzewasz, że funkcja źle działa (np. zwiesza mikrokontroler) możesz zrobić coś takiego:

void wypisz_date(void)
{
  return; // czyli funkcja się nie będzie wykonywać
  lcd.clear();
    // i tu kod wypisujący datę
}

A ekran mruga bo za każdym obrotem loop czyścisz ekran, wypisujesz coś tam i zanim znowu zdążysz przeczytać, czyścisz ekran, wypisujesz, czyścisz ekran, wypisujesz... Na początek zrób tak, żeby wypisywać różne mądre rzeczy na ekranie tylko wtedy, gdy jakaś tam zmienna zmieniła swoją wartość.

O tym jak zareagować na zmianę wartości zmiennej tyle już na tym forum napisano, że nie śmiałbym pisać jeszcze raz bo wyszłoby na to, że uważam Ciebie za jakiegoś jełopa co nie potrafi czytać...

  • Lubię! 1
Link do komentarza
Share on other sites

Zrobiłem ta, że po tym jak zmienna zmienia swoją wartość po tym jak machnę ręką w prawo lub lewo. Oraz wyświetla się na ekranie wartość zmiennej i ten kod działa prawidłowo. Kod:

#include<Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIR 12
#include <TroykaDHT.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

// Ustawienie adresu ukladu na 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);

// the setup function runs once when you press reset or power the board
void setup() {
    //LCD
 lcd.init();
  lcd.backlight(); 
    lcd.begin(20, 4);
    
    Serial.begin(115200);
    
    //komunikat RTC w razie braku moduł
    if (! rtc.begin()) {
    lcd.setCursor(0,0 );
    lcd.print("Nie znaleziono RTC");
    delay(1500);
    lcd.noBacklight(); 
    lcd.clear();
    }  
//ustawianie czasu w pamkięci RTC
  if (rtc.lostPower()) {
  //ustawianie czasu  podczas komplikacji
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   //ustawianie casu ręcznie rok-miesiąc-dzień-godzina-minuty-numer dnia tygodnia
   //rtc.adjust(DateTime(2025, 10, 4, 14, 57, 6));
  }
  
  //apds9960    
     if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  
  apds.enableProximity(true);
  apds.enableGesture(true);
  


}


///////////////////////////////////////////////////////////////////////////////////////////////////////////

int zmienna = 1;

char bufor[17];
char buforr[14];

void loop() {
      //ustawianie zegara
     DateTime now = rtc.now();

// czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();

sprintf(bufor,"%02d:%02d %02d.%02d.%04d", czasletni, now.minute(), now.day(), now.month(), now.year());
sprintf(buforr,"%02d:%02d", czasletni, now.minute());


 switch(zmienna) {
  case 1:
    lcd.clear();
    break;
  case 2:
       lcd.setCursor(0,0);
       lcd.print(bufor);
       break;
  case 3:
      lcd.setCursor(0,1);
      lcd.print(buforr);
        break;
     }
     
   uint8_t gesture = apds.readGesture();
  if(gesture == APDS9960_DOWN) Serial.println("v");
    if(gesture == APDS9960_UP) Serial.println("^");
  if(gesture == APDS9960_RIGHT) { zmienna++; lcd.setCursor(0,3); lcd.print(zmienna); }
  if(gesture == APDS9960_LEFT){ zmienna--; lcd.setCursor(0,3); lcd.print(zmienna); }
}

Ale mam problem z tym jak funkcją sprintf wyświetlić na lcd temperaturę i wilgotność próbowałem tak ale nie działa :

char bufor[8];

  dht1.read();
     switch(dht1.getState()) {
     case DHT_OK:
sprintf(bufor,"temp = C w = %", dht1.getTemperatureC(), dht1.getTemperatureC());
     }

 

Link do komentarza
Share on other sites

58 minut temu, Wiktor2019 napisał:

próbowałem tak ale nie działa

Pisałem zapoznać się a nie próbować na pałę!

Bufor ma pojemność 8 znaków, a ile chcesz tam wsadzić? Na moje oko jakieś 20. Myślisz że się zmieści? Jak dobrze upchniesz i jeszcze nogą pociśniesz?

Znak '%' oznacza, że za nim coś będzie - na przykład ciąg oznaczający co ma być wypisane. A Ty nie masz nic. To co ma sprintf wypisać? Wierszyk?

Zacznij od https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html i wróć jak przeczytasz wszystko o sprintf i formatowaniu.

  • Lubię! 1
Link do komentarza
Share on other sites

Poczytałem i wiem już jak odczytać w funkcji sprintf temperaturę i wilgotność. Ale mam taki problem, że program się trochę zawiesza. Kod:

#include<Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIR 12
#include <TroykaDHT.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;



// Ustawienie adresu ukladu na 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);

//dht22/11
DHT dht1(10, DHT22);
DHT dht2( 6, DHT22);
DHT dht3( 2, DHT11);

// the setup function runs once when you press reset or power the board
void setup() {
  //dht22
    dht1.begin();
    dht2.begin();
    dht3.begin();

    
    //LCD
 lcd.init();
  lcd.backlight(); 
    lcd.begin(20, 4);
    
    Serial.begin(115200);
    
    //komunikat RTC w razie braku moduł
    if (! rtc.begin()) {
    lcd.setCursor(0,0 );
    lcd.print("Nie znaleziono RTC");
    delay(1500);
    lcd.noBacklight(); 
    lcd.clear();
    }  
//ustawianie czasu w pamkięci RTC
  if (rtc.lostPower()) {
  //ustawianie czasu  podczas komplikacji
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   //ustawianie casu ręcznie rok-miesiąc-dzień-godzina-minuty-numer dnia tygodnia
   //rtc.adjust(DateTime(2025, 10, 4, 14, 57, 6));
  }
  
  //apds9960    
     if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  
  apds.enableProximity(true);
  apds.enableGesture(true);
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////

int zmienna = 1;

char bufor1[17];
char bufor2[17];
char bufor3[17];
char bufor4[17];
char bufor9[10];

void loop() {
  
//ustawianie zegara
     DateTime now = rtc.now();

// czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();


 dht1.read();
int czujnikTemp1 = dht1.getTemperatureC();
int czujnikWilg1 = dht1.getHumidity();

 dht2.read();
int czujnikTemp2 = dht2.getTemperatureC();
int czujnikWilg2 = dht2.getHumidity();
   


sprintf(bufor1,"%02d:%02d %02d.%02d.%04d", czasletni, now.minute(), now.day(), now.month(), now.year());
sprintf(bufor2,"%02d:%02d", czasletni, now.minute());
sprintf(bufor3,"%dC %dRh", czujnikTemp1, czujnikWilg1);
sprintf(bufor4,"%dC %dRh", czujnikTemp2, czujnikWilg2);
sprintf(bufor9,"                    ");

 switch(zmienna) {
  case 1:
       lcd.clear();
       break;
  case 2:
       lcd.setCursor(0,0);
       lcd.print(bufor1);
       lcd.print(bufor9);
       break;
  case 3:
      lcd.setCursor(0,0);
      lcd.print(bufor2);
      lcd.print(bufor9);
      break;
   case 4:
      lcd.setCursor(0,0);
      lcd.print(bufor3);
      lcd.print(bufor9);
      break;
  case 5:
      lcd.setCursor(0,0);
      lcd.print(bufor4);
      lcd.print(bufor9);
      break;
        case 6:
      lcd.setCursor(0,0);
      lcd.print(bufor3);
      lcd.print(bufor9);
      break;
     }


      
   uint8_t gesture = apds.readGesture();
  if(gesture == APDS9960_DOWN) Serial.println("v");
    if(gesture == APDS9960_UP) Serial.println("^");
  if(gesture == APDS9960_RIGHT) { zmienna++; lcd.setCursor(0,3);  lcd.print(zmienna); }
  if(gesture == APDS9960_LEFT){ zmienna--; lcd.setCursor(0,3); lcd.print(zmienna); }
}

 

Link do komentarza
Share on other sites

Pamiętaj, że odczyty z czujników (szczególnie 1-Wire) trochę trwają, a Ty niepotrzebnie odczytujesz wszystko za każdym obrotem loop nawet wtedy, gdy nie będą w ogóle wykorzystane. Nie mam takiego czujnika gestów więc nie sprawdzę... ale być może te opóźnienia są powodem jakichś zwisów? Trudno powiedzieć... Ja bym dodał parę linijek, coś w stylu:
 

Serial.print("Odczyt gestu:");delay(100);
uint98_t gesture = apds.readGesture();
Serial.println((int)gesture);

(delay się przydaje, bo jeśli zwiesi się readGesture to jest duża możliwość, że poprzedzający print nie zadziała - ot, taka uroda zablokowanych przerwań).

Moja propozycja:

  • Nie odczytywać danych z czujników temperatury i wilgotności częściej niż co minutę (jak to zrobić - było w kursie o opóźnieniach bez millis() i w fafnastu innych wątkach);
  • Odczytywać tylko te dane które będą wypisywane.

 

  • Lubię! 1
Link do komentarza
Share on other sites

Usunąłem z kodu funkcję sprintf ponieważ wydaje mi się, że zawiesza program. Ale jak dodałem do programu pozostałe ekrany co miałem wcześniej to program też zaczął się zawieszać. Program działa bez zarzutu jeśli machnę ręką co około 10 min. Kod:

#include<Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>
#define PIR 12
#include <TroykaDHT.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;

// Temperatury maksymalne i ninimalne
int tempmin1 = 100;
int tempmax1 = 1;
int tempmin2 = 100;
int tempmax2 = 1;
int tempmin3 = 100;
int tempmax3 = 1;


//dni tygodnia
char daysOfTheWeek[7][12] = {"ndz", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"};


// Ustawienie adresu ukladu na 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);

//dht22/11
DHT dht1(10, DHT22);
DHT dht2( 6, DHT22);
DHT dht3( 2, DHT11);

//ds18b20
#define ONE_WIRE_BUS1 7 
OneWire oneWire1(ONE_WIRE_BUS1); 
DallasTemperature sensors1(&oneWire1);

// the setup function runs once when you press reset or power the board
void setup() {
  //dht22
    dht1.begin();
    dht2.begin();
    dht3.begin();

//Rozpoczęcie pracy Ds18B20
    sensors1.begin(); 

    pinMode(11, INPUT_PULLUP);
    pinMode(8, INPUT);
        pinMode(13, OUTPUT);
    
    //LCD
 lcd.init();
  lcd.backlight(); 
    lcd.begin(20, 4);
    
    Serial.begin(115200);
    
    //komunikat RTC w razie braku moduł
    if (! rtc.begin()) {
    lcd.setCursor(0,0 );
    lcd.print("Nie znaleziono RTC");
    delay(1500);
    lcd.noBacklight(); 
    lcd.clear();
    }  
//ustawianie czasu w pamkięci RTC
  if (rtc.lostPower()) {
  //ustawianie czasu  podczas komplikacji
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   //ustawianie casu ręcznie rok-miesiąc-dzień-godzina-minuty-numer dnia tygodnia
   //rtc.adjust(DateTime(2025, 10, 4, 14, 57, 6));
  }
  
  //apds9960    
     if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  
  apds.enableProximity(true);
  apds.enableGesture(true);
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////

int zmienna = 1;

int czujnikWilg3;
int czujnikTemp3;
int czujnikWilg1;
int czujnikTemp1;
int czujnikWilg2;
int czujnikTemp2;
 
void loop() {

 //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;
  
  //Jeśli różnica wynosi ponad sekundę
  if (roznicaCzasu >= 3000UL) {delay(10);
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
     dht3.read();
  czujnikWilg3 = dht3.getHumidity();
 
 sensors1.requestTemperatures();
  czujnikTemp3 = sensors1.getTempCByIndex(0);
 
  dht1.read();
  czujnikWilg1 = dht1.getHumidity();
  czujnikTemp1 = dht1.getTemperatureC();

    dht2.read();
  czujnikWilg2 = dht2.getHumidity();
  czujnikTemp2 = dht2.getTemperatureC();
//................................................................ 
// na zewnatrz
  if(czujnikTemp1 < tempmin1){
     tempmin1 = czujnikTemp3;
  }
  if(czujnikTemp3 > tempmax1 & czujnikTemp3 < 50){
      tempmax1 = czujnikTemp3;
  }
 
// w tym pokoju
  if(czujnikTemp2 < tempmin2){
      tempmin2 = czujnikTemp2;
      }
      if(czujnikTemp2 > tempmax2){
      tempmax2 = czujnikTemp2;
      }
      
// na dole
  if(czujnikTemp2 < tempmin3){
      tempmin3 = czujnikTemp2;
  }
  if(czujnikTemp2 > tempmax3){
     tempmax3 = czujnikTemp2;
   }
    Serial.println(aktualnyCzas);
  }


   
//ustawianie zegara
     DateTime now = rtc.now();

// czas letni i zimowy + 1 godzina z powodu pobrania złaj godziny podczas kompilacji
     int czasletni = now.hour() +2;
     int czaszimowy = now.hour() +1;
     int minuty = now.minute();


 switch(zmienna) {
case 1:
       lcd.clear();
       lcd.noBacklight();
       digitalWrite(13,LOW);
       break;
case 2:
       lcd.clear();
       zmienna++;
       break;
case 3:
     lcd.backlight();
     if (digitalRead(11) == HIGH){
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czasletni);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }else{
     lcd.setCursor(7,0);
     lcd.print("czas");
     lcd.setCursor(0,1); 
     lcd.print(czaszimowy);
     lcd.print(':');
  if (now.minute()<10){
     lcd.print("0");
     lcd.print(now.minute(), DEC);
  } else {
     lcd.print(now.minute(), DEC);
  }
     lcd.setCursor(7, 2);
     lcd.print("data");;
     lcd.setCursor(0, 3);
  if (now.day()<10){
     lcd.print("0");
     lcd.print(now.day(), DEC);
  } else {
     lcd.print(now.day(), DEC);
  }
     lcd.print('/');
  if (now.month()<10){
     lcd.print("0");
     lcd.print(now.month(), DEC);
  } else {
     lcd.print(now.month(), DEC);
  }
     lcd.print('/');
     lcd.print(now.year(), DEC);
     lcd.setCursor(15, 3);
     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  }
       break;
case 4:
       lcd.clear();
       zmienna++;
       zmienna++;
       break;
case 5:
       lcd.clear();
       zmienna--;
       zmienna--;
       break;
case 6:   
     lcd.setCursor(5,0);
     lcd.print("NA ZEWN");
 //    lcd.write(byte(1));
     lcd.print("TRZ");
     lcd.setCursor(0, 1);//
     lcd.print("Temperatura ");
     lcd.print(czujnikTemp3); 
   //  lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0, 2);
     lcd.print("Wilgotno");
 //    lcd.write(byte(2));
 //    lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(czujnikWilg3);
     lcd.print("%");
     lcd.setCursor(0, 3);
     lcd.print(" ");
      break;
case 7:
       lcd.clear();
       zmienna++;
       zmienna++;
       break;
case 8:
       lcd.clear();
       zmienna--;
       zmienna--;
       break;
case 9:
     lcd.setCursor(4,0);
     lcd.print("W TYM POKOJU"); 
     lcd.setCursor(0, 1);
     lcd.print("Temperatura "); 
     lcd.print(czujnikTemp1);
 //    lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0,2); 
     lcd.print("Wilgotno");
  //   lcd.write(byte(2));
  //   lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(czujnikWilg1);
     lcd.print(" %");
     lcd.setCursor(0, 3);
     lcd.print(" ");
  break;
case 10:
       lcd.clear();
       zmienna++;
       zmienna++;
       break;
case 11:
       lcd.clear();
       zmienna--;
       zmienna--;
       break;
case 12:
       lcd.setCursor(7,0);
     lcd.print("Na DOLE");
     lcd.setCursor(0, 1);
     lcd.print("Temperatura "); 
     lcd.print(czujnikTemp2);
   //  lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(0,2); 
     lcd.print("Wilgotno");
   //  lcd.write(byte(2));
   //  lcd.write(byte(3));
     lcd.print(" ");
     lcd.print(czujnikWilg2);
     lcd.print(" %");
     lcd.setCursor(0, 3);
     lcd.print(" ");
      break;
case 13:
       lcd.clear();
       zmienna++;
       zmienna++;
       break;
case 14:
       lcd.clear();
       zmienna--;
       zmienna--;
       break;
case 15:
     lcd.setCursor(5,0);
     lcd.print("NA ZEWN");
 //    lcd.write(byte(1));
     lcd.print("TRZ");
     lcd.setCursor(0, 1);
     lcd.print("T");
 //    lcd.write(byte(5));
 //    lcd.write(byte(4));
     lcd.print(" ");
     lcd.print(tempmin1);
 //    lcd.write(byte(0));
     lcd.print("C");
     lcd.print(" ");
     lcd.print(tempmax1);
 //    lcd.write(byte(0));
     lcd.print("C");
     lcd.setCursor(4, 2);
     lcd.print("W TYM POKOJU"); 
     lcd.setCursor(0, 3);
     lcd.print("T");
   //  lcd.write(byte(5));
  //   lcd.write(byte(4));
     lcd.print(" ");
     lcd.print(tempmin2);
  //   lcd.write(byte(0));
     lcd.print("C");
     lcd.print(" ");
     lcd.print(tempmax2);
  //   lcd.write(byte(0));
     lcd.print("C");
      break;
case 16:
zmienna = 1;
      break;
     }
    

   uint8_t gesture = apds.readGesture(); delay(10);
  if(gesture == APDS9960_DOWN) Serial.println("v");
    if(gesture == APDS9960_UP) Serial.println("^");
  if(gesture == APDS9960_RIGHT) { zmienna++; lcd.setCursor(0,3);  lcd.print(zmienna); }
  if(gesture == APDS9960_LEFT){ zmienna--; lcd.setCursor(0,3); lcd.print(zmienna); }
}

 

Link do komentarza
Share on other sites

30 minut temu, Wiktor2019 napisał:

Usunąłem z kodu funkcję sprintf ponieważ wydaje mi się, że zawiesza program

No pewne - jak próbowałeś zmieścić 20 bajtów w ośmiobajtowym buforze to się nie dziwię. Tak samo - jeśli zamiast poczytać i zrozumieć jak to działa kombinujesz z jakimiś dziwactwami podatrzonymi w przykładach dotyczących czegoś zupełnie innego.

Już Jonathan Swift opisywał podobne przypadki... milion małp posadzonych przy klawiaturze... w końcu któraś napisze Hamleta

ok, więcej nie napiszę bo się admin doczepi że jestem niegrzeczny.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Jak pisałem wcześniej program działał prawie dobrze ale się zawieszał i funkcja sprintf też działała. Popatrz na mój kod z czwartku.

Edytowano przez Wiktor2019
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.