Pomoc s programem - arduino uno

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#16 Příspěvek od FHonza »

Přijde mi už divné

Kód: Vybrat vše

int rtc[68]
a poté

Kód: Vybrat vše

 RTC.get(rtc, true)
Proč by se z DS1307 četlo 68 "dvojbajtů" ?
Dej sem prosím odkaz na DS1307.h který používáš (po internetu jich koluje celá řada).

A hlavně

Kód: Vybrat vše

char cas[9]; 
  // zapíše do pole znaků cas hodnoty z rtc 
  
 sprintf(cas, "%02d.%02d.%02d  %02d:%02d", rtc[4],rtc[5],rtc[6],rtc[2],rtc[1]);
vyhradíš si 10 byte a to je evidentně málo. sprintf ti píše "za roh" po paměti

Uživatelský avatar
passion
Příspěvky: 890
Registrován: 22 črc 2005, 02:00
Bydliště: Žilina

#17 Příspěvek od passion »

Máš 68bajtový čas,ten ti vymaže zvyšok LCD.

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#18 Příspěvek od FHonza »

no

Kód: Vybrat vše

int rtc[68]
není 68 byte

Uživatelský avatar
passion
Příspěvky: 890
Registrován: 22 črc 2005, 02:00
Bydliště: Žilina

#19 Příspěvek od passion »

Ušlo mi to int, 2x. Sorry

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#20 Příspěvek od luki28n »

http://www.santy.cz/moduly-c22/arduino- ... _UEALw_wcB
tady je odkaz..

program na ten čas mám z nějaké stránky, nemůžu ji najít teď..

já tomu relativně rozumím, pochopím příkazy některé, jak mají fungovat, ale víc do hloubky nevidím.

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#21 Příspěvek od luki28n »

Vzhledem k tomu, že mě tlačí čas, bych možná poprosil o něco víc.

Je někdo ochoten mi napsat program (i s popiskama) podle požadavků, které mu zadám? Jsem ochoten mu za to zaplatit. Můžeme se dohodnout, když mi napíšete soukromou zprávu. Děkuji.

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#22 Příspěvek od FHonza »

Zkus nejdřív změnit tu deklaraci

Kód: Vybrat vše

char cas[9]
na

Kód: Vybrat vše

char cas[15]
Doufám že dobře počítám: 5x "dvojcifra" + 2x tečka + 1x dvojtečka + 2x mezera + #0

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#23 Příspěvek od luki28n »

FHonza.. máš pravdu! Děkuji, celé to teď funguje...

Jak říkám, je to tím, že ty programy nepíšu, jen vždy kopíruju a upravuji hodnoty.. a tady jsem si nevšiml, proč to má to číslo a díky Tobě jsem to pochopil.. děkuji

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#24 Příspěvek od Atlan »

Ved to arduinisti... Takzvany lepici kodov. Ale su medzi nimi aj machri ktory to stym vedia.

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#25 Příspěvek od FHonza »

Když už teda OT: proč hned tak hanlivě ? Já když jsem potřeboval pomoc s pračkou tady na fóru, tak mě taky hned nikdo nenazval lepičem praček. A podle mého názoru Arduino tak trochu o tom "lepení" vlastně je a kvůli tomu i vzniklo. V tom dobrém slova smyslu.

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#26 Příspěvek od luki28n »

Honzo to si asi neber osobně, hezky to vystihnul :)
Já jsem moc rád, že jsou tu ochotní lidé a říkám si že jak budu něčemu taky rozumět, rád tu zavítám a pomohu někomu dalšímu.

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#27 Příspěvek od luki28n »

Tak další problém.. povedlo se mi úspěšně nastavit otvírání na 3 různá hesla, přičemž při každém se objekt otevře, ale na display to napíše pokaždé něco jiného

Ale stihl mě problém s tím, že se mi neaktualizuje čas. Tedy aktualizuje se tehdy, pokud v tom programu, který ten čas vypisuje napíšu

Kód: Vybrat vše

lcd.print(cas); // vypíše cas na displej 
delay(1000);
lcd.celar()
ale ta funkce delay mi v celém program udělá neplechu, (asi proto, že pokaždé když tam program dojde, tak se na sekundu zastaví činnost), tak jsem chtěl použít funkci millis.. nastudoval jsem si ji a myslel, že bude fungovat správně, ale nefunguje vůbec. Dám sem kód s tím millis (díky němu se na displey nezobrazí nic ani nic nefunguje)

Kód: Vybrat vše

#include <Keypad.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DS1307.h> 
//#define Password_Lenght 5 //délka hesla 5 
LiquidCrystal_I2C lcd(0x27,20,4); 
//byte data_count = 0, master_count = 0; 
//bool Pass_is_good; 
char stisknutyznak; 
char pressedKey[5] = {'0','0','0','0'}; // sem se budou ukládat stiskuté znaky
long vypiscasu;
char code[5] = {'1','9','4','7'}; //  kód pro otevření dveří
char code2[5] = {'1','9','9','9'}; //  kód pro otevření dveří
char code3[5] = {'4','0','9','5'}; //  kód pro otevření dveří
 
int rtc[68]; 
const byte ROWS = 4; 
const byte COLS = 3; 
char keys[ROWS][COLS] = { 
  {'1','2','3'}, 
  {'4','5','6'}, 
  {'7','8','9'}, 
  {'*','0','#'} 
}; 

byte rowPins[ROWS] = { 
  8,7,6,5}; //connect to the row pinouts of the keypad 
byte colPins[COLS] = { 
  9,3,2}; //connect to the column pinouts of the keypad 

Keypad klavesnice( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //initialize an instance of class NewKeypad 
int zamceno; 
int magnet = 10; 
int sirena = 0; 
void setup() 
{ 
  
  pinMode(magnet, INPUT); 
  pinMode(sirena, OUTPUT); 

  lcd.begin();// initialize the lcd 
  lcd.backlight(); 
  lcd.setCursor(4,0); // nastaví kurzor na pozici 
  RTC.set(DS1307_DATE,13); // nastaví den v měsíci 
  RTC.set(DS1307_MTH,4); // nastaví měsíc 
  RTC.set(DS1307_YR,18); // nastaví rok 
  RTC.set(DS1307_MIN,49); // nastaví minuty 
  RTC.set(DS1307_HR,11); // nastaví hodiny 
  RTC.start(); // spustí čas 
} 

void loop() 
{char stisknutyznak = klavesnice.getKey();// vytvoří proměnnou, do které uloží znak stisknuté klávesy
 { if (millis() > (10000 + vypiscasu))
{

  RTC.get(rtc,true);  
  // připraví pole znaků pro čas 
 char cas[15]; 
  // zapíše do pole znaků cas hodnoty z rtc 
  
 sprintf(cas, "%02d.%02d.%02d  %02d:%02d", rtc[4],rtc[5],rtc[6],rtc[2],rtc[1]); 
    
  lcd.setCursor(3,3); // nastaví kurzor na pozici 
  lcd.print(cas); // vypíše cas na displej 
  }
  else
  vypiscasu = millis();
  }
  

if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno 
{ 
  zamceno=1; 
    lcd.setCursor (4,0); 
lcd.print("Zamceno"); 
digitalWrite(magnet, HIGH);//  a zapne se magneticky senzor 
delay(1000) ; 
lcd.clear(); // po 5ti sekundách se nápis "zamčeno" smaže 
  
} 
  if(digitalRead(magnet) == HIGH and zamceno==1){ 

digitalWrite(sirena, HIGH); 
delay(3000); 
digitalWrite(sirena,LOW); 
} 

else{ 

digitalWrite(sirena, LOW); 

} 

{
  // přečte stiskuté tlačítko a uloží do customKey
 
 
  if (stisknutyznak){
    // když je stisknuto potvrzovací tlačítko *
    if (stisknutyznak == '*')
    {
    // když se pole kódu rovná poli stiskutých talčítek
      if ((pressedKey[0] == code[0]) && (pressedKey[1] == code[1]) && (pressedKey[2] == code[2]) && (pressedKey[3] == code[3]))
        {
         
          lcd.print("Vitej Luki");
          zamceno=0;
          delay(2000);
          lcd.clear();
          
          // vynuluj stiskuté tlačítka
          pressedKey[0] = '0';
          pressedKey[1] = '0';
          pressedKey[2] = '0';
          pressedKey[3] = '0';
        }
   else if ((pressedKey[0] == code2[0]) && (pressedKey[1] == code2[1]) && (pressedKey[2] == code2[2]) && (pressedKey[3] == code2[3]))
    {
    lcd.print("Vitej mami");
          zamceno=0;
          delay(2000);
          lcd.clear();
          
          // vynuluj stiskuté tlačítka
          pressedKey[0] = '0';
          pressedKey[1] = '0';
          pressedKey[2] = '0';
          pressedKey[3] = '0';
    
    }
    else if ((pressedKey[0] == code3[0]) && (pressedKey[1] == code3[1]) && (pressedKey[2] == code3[2]) && (pressedKey[3] == code3[3]))
    {
    lcd.print("Vitej tati");
          zamceno=0;
          delay(2000);
          lcd.clear();
          
          // vynuluj stiskuté tlačítka
          pressedKey[0] = '0';
          pressedKey[1] = '0';
          pressedKey[2] = '0';
          pressedKey[3] = '0';
    
    }
    
    
    }
   
    // když není stisknuto potvrzovací tlačítko #
     else
    {
   
    //přidej znak do pole a znaky posuň
    pressedKey[0] = pressedKey[1];
    pressedKey[1] = pressedKey[2];
    pressedKey[2] = pressedKey[3];
    pressedKey[3] = stisknutyznak;  
 
    
    }
}
}
}

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#28 Příspěvek od FHonza »

Takhle to ani fungovat nemůže, protože ta podmínka

Kód: Vybrat vše

if (millis() > (10000 + vypiscasu))
není nikdy splněná. Pokaždé se proměnná vypiscasu nastaví na hodnotu vrácenou funkcí millis(). Takže nebude nikdy o 10000 menší aktuální hodnota vrácená funkcí millis(). To dělá ta část kódu:

Kód: Vybrat vše

else 
  vypiscasu = millis();
• doplň inicializaci proměnné vypiscasu
• přesuň tu část kódu na konec těla podmínky

Kód: Vybrat vše

...
lcd.setCursor(3,3); // nastaví kurzor na pozici 
lcd.print(cas); // vypíše cas na displej 
vypiscasu = millis();
Edit: formátuj alespoň trochu zdrojový text, takhle je to nepřehledné a hůř se v tom dá vyznat. Je celá řada "zhezčovačů" kódu, např. tady

Uživatelský avatar
luki28n
Příspěvky: 23
Registrován: 06 bře 2018, 01:00

#29 Příspěvek od luki28n »

ještě mě napadlo udělat si takové počítadlo
dal bych
int pocitadlo;
void (setup)
pocitadlo = 0;
void (loop)
{
pocitadlo ++;
{ if (!(pocitadlo() % 500))
// aktualizoval by se čas na displeji
}

šlo by to i takto? mně to totiž píše, že nemůžu 'pocitadlo' použít jako funkci, takže asi ne..

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#30 Příspěvek od FHonza »

No proměnná nejde používat jako funkce, překladač má vždy pravdu :)
Vyhoď ty dvě závorky.

Kód: Vybrat vše

 if (!(pocitadlo % 500)) 

A pročíst základy C/C++ není na škodu. Např. https://www.sallyx.org/sally/c/

a ještě edit: nedávej podmínku do složených závorek, je to zbytečné a znepřehledňuje to kód

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“