NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
pgarsky
Člen
Avatar
pgarsky:7.1.2017 18:29

Zdravím, potřeboval bych jednu radu. Už hodinu tady nad tím dumám, ale pořád mi nic nefunguje. Takže se opět obracím sem.
Nejprve sem hodím zdroják:

#include <LiquidCrystal.h>
#include <SD.h>

int odpocitavani = 0;
float cas = 30;
int heslo = 7755332200;
bool alarm = false;
bool sejmuto = false;
bool odpocitavat = false;
bool cistsc = false;
int tlacitko = 0;
int sdo = 13; //Jelikož nevím, jak udělat, aby Arduino vzalo SD kartu už, když je vložená SD až po zapnutí, tak jsem 5V u čtečky SD připojil na pin 13, který se zapne, až k tomu dostane pokyn
int sd = 53;
int sensor = 49; //Sensor pohybu
int piezo = 4;
int cervena = 2;
int zelena = 3;
int bila = 5;
int modra = 6;
String text;
LiquidCrystal LCD(7, 8, 9, 10, 11, 12);


void setup()
{
  Serial.begin(9600);
  LCD.begin(20, 4);
  LCD.setCursor(0, 0);
  SD.begin(sd);
  pinMode(sdo, OUTPUT);
  pinMode(sensor, INPUT);
  pinMode(piezo, OUTPUT);
  pinMode(cervena, OUTPUT);
  pinMode(zelena, OUTPUT);
  pinMode(bila, OUTPUT);
  pinMode(modra, OUTPUT);
  LCD.print("Vitejte!");
  digitalWrite(cervena, HIGH);
}

void loop()
{
  LCD.setCursor(0, 1);
  LCD.print("V poradku.     ");
  int sejmul = digitalRead(sensor);
  if (sejmul)
  {
    sejmuto = true;
  }
  if (!sejmuto)
  {
    LCD.setCursor(0, 2);
    LCD.print(" ");
    digitalWrite(bila, LOW);
    digitalWrite(modra, LOW);
  }
  else
  {
    tone(piezo, 1023);
    delay(1000);
    noTone(piezo);
    odpocitavat = true;
  }
  if (odpocitavat)
  {
    LCD.setCursor(0, 1);
    LCD.print("Odpocitavani: ");
    LCD.setCursor(0, 2);
    LCD.print("Vlozte SD s pinem");
    for (int i = 30;i >= 0;i--)
    {
      LCD.setCursor(14, 1);
      LCD.print(i);
      LCD.print(" ");
      delay(1000);
    }
    if (odpocitavani == 0)
      {
        odpocitavat = false;
        sejmuto = false;
        alarm = true;
      }
  }
  if (alarm)
  {
    do
    {
    tone(piezo, 900);
    digitalWrite(modra, HIGH);
    digitalWrite(bila, LOW);
    delay(150);
    digitalWrite(modra, LOW);
    digitalWrite(bila, HIGH);
    delay(150);
    } while(alarm == true);
  }
}
void ctiSD()
{
  int tlacitkoHodnota = digitalRead(22);
  if (tlacitkoHodnota == HIGH)
  {
    digitalWrite(sdo, HIGH);
    File soubor = SD.open("pin.txt");
    if (soubor)
    {
      while(soubor.available())
      {
        text = char(soubor.read());
      }
      if (text == heslo)
      {
        digitalWrite(cervena, LOW);
        digitalWrite(zelena, HIGH);
        odpocitavat = false;
        alarm = false;
        sejmuto = false;
        LCD.setCursor(0, 3);
        LCD.print("Karta prijata.     ");
      }
      else
      {
        LCD.setCursor(0, 3);
        LCD.print("Karta odmitnuta.");
      }
    }
  }
}

Potřeboval bych vědět, kam funkci ctiSD() umístit tak, aby to ten systém přečetl, ale až po pípnutí, že sensor pohybu zaznamenal pohyb. Případně, pokud můj problém se čtením SD karty, když je Arduino už v běhu jde vyřešit jinak, než pustit do ní 5V, budu moc rád i za tuto radu.

Editováno 7.1.2017 18:32
Odpovědět
7.1.2017 18:29
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:7.1.2017 22:54

uprav si funkci ctiSD, aby ti detekovala zasunuti karty

bool ctiSD()
{
    int tlacitkoHodnota = digitalRead(22);
    if (tlacitkoHodnota == HIGH)
    {
        digitalWrite(sdo, HIGH);

//uprava start
        int timeout = 900;//nastav si jaky chces, ale mel by byt mensi nez 1000 (1sec)
        while(!SD.init())
        {
            if(--timeout==0)
            {
                LCD.setCursor(0, 3);
                LCD.print("Karta neindikovana  ");
                break;
            }
            delay(1);
        }
        if(timeout==0)return false;//kdyz nenajde kartu vrati se zpet
        //nebo pokracuje
//uprava end
        File soubor = SD.open("pin.txt");
        if (soubor)
        {
            while(soubor.available())
            {
                text = char(soubor.read());
            }
            if (text == heslo)
            {
                digitalWrite(cervena, LOW);
                digitalWrite(zelena, HIGH);
                odpocitavat = false;
                alarm = false;
                sejmuto = false;
                LCD.setCursor(0, 3);
                LCD.print("Karta prijata.     ");
                return true;//uprava
            }
            else
            {
                LCD.setCursor(0, 3);
                LCD.print("Karta odmitnuta.");
                return false;//uprava
            }
        }
    }
}

volání té funkce vlož do cyklu pro odpočítávání

for (int i = 30;i >= 0;i--)
{
  if(ctiSD)break;//uprava  - pri kladnem vysledku ukonci odpocet
  LCD.setCursor(14, 1);
  LCD.print(i);
  LCD.print(" ");
  delay(1000);
}
 
Nahoru Odpovědět
7.1.2017 22:54
Avatar
pgarsky
Člen
Avatar
Odpovídá na ostrozan
pgarsky:7.1.2017 23:18

Píše mi to tohle: exit status 1
'class SDLib::SDClass' has no member named 'init'

Dále jsem se ještě chtěl zeptat: Proč tady: if(--timeout==0) jsou před tím timout ty pomlčky?

Nahoru Odpovědět
7.1.2017 23:18
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na pgarsky
ostrozan:7.1.2017 23:36

jo promiň má tam být

while(!SD.begin(sd))  //misto SD.init()

a k těm "pomlčkám" - to jsou mínusy a znamenají dekrementaci - odečtení jedné z hodnoty (zde timeout)

doporučuju ti, než budeš pokračovat projít si alespoň základy Céčka

 
Nahoru Odpovědět
7.1.2017 23:36
Avatar
pgarsky
Člen
Avatar
Odpovídá na ostrozan
pgarsky:7.1.2017 23:39

To jsem zkoušel ještě dříve, než jsem si pořídil Arduino, ale vůbec mi to nefunguje a nejde nic spustit.

Nahoru Odpovědět
7.1.2017 23:39
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
pgarsky
Člen
Avatar
Odpovídá na ostrozan
pgarsky:7.1.2017 23:43

Teď nastal zase jiný problém, teď mi to místo odpočítávání hodí rovnou alarm.

Nahoru Odpovědět
7.1.2017 23:43
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na pgarsky
ostrozan:7.1.2017 23:50

a je to s kartou nebo bez?
když tak uprav

if(ctiSD()){odpocitavani=1;break;}//uprava  - pri kladnem vysledku ukonci odpocet
Editováno 7.1.2017 23:50
 
Nahoru Odpovědět
7.1.2017 23:50
Avatar
pgarsky
Člen
Avatar
Odpovídá na ostrozan
pgarsky:7.1.2017 23:52

teď to zase dělá to, že to každou sekundu pípá a LCD zobrazuje každou sekundu: "V poradku"/"Odpo­citavani"

Nahoru Odpovědět
7.1.2017 23:52
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na pgarsky
ostrozan:7.1.2017 23:56

hoď sem kód jak je to aktuálně

 
Nahoru Odpovědět
7.1.2017 23:56
Avatar
pgarsky
Člen
Avatar
Odpovídá na ostrozan
pgarsky:8.1.2017 8:15
#include <LiquidCrystal.h>
#include <SD.h>

int odpocitavani = 0;
float cas = 30;
int heslo = 7755332200;
bool alarm = false;
bool sejmuto = false;
bool odpocitavat = false;
bool cistsc = false;
int tlacitko = 0;
int sdo = 13;
int sd = 53;
int sensor = 49;
int piezo = 4;
int cervena = 2;
int zelena = 3;
int bila = 5;
int modra = 6;
String text;
LiquidCrystal LCD(7, 8, 9, 10, 11, 12);


void setup()
{
  Serial.begin(9600);
  LCD.begin(20, 4);
  LCD.setCursor(0, 0);
  SD.begin(sd);
  pinMode(sdo, OUTPUT);
  pinMode(sensor, INPUT);
  pinMode(piezo, OUTPUT);
  pinMode(cervena, OUTPUT);
  pinMode(zelena, OUTPUT);
  pinMode(bila, OUTPUT);
  pinMode(modra, OUTPUT);
  LCD.print("Vitejte!");
  digitalWrite(cervena, HIGH);
}

void loop()
{
  LCD.setCursor(0, 1);
  LCD.print("V poradku.     ");
  int sejmul = digitalRead(sensor);
  if (sejmul)
  {
    sejmuto = true;
  }
  if (!sejmuto)
  {
    LCD.setCursor(0, 2);
    LCD.print(" ");
    digitalWrite(bila, LOW);
    digitalWrite(modra, LOW);
  }
  else
  {
    tone(piezo, 1023);
    delay(1000);
    noTone(piezo);
    odpocitavat = true;
  }
  if (odpocitavat)
  {
    LCD.setCursor(0, 1);
    LCD.print("Odpocitavani: ");
    LCD.setCursor(0, 2);
    LCD.print("Vlozte SD s pinem");
    for (int i = 30;i >= 0;i--)
{
  if(ctiSD){odpocitavani=1;break;}
  LCD.setCursor(14, 1);
  LCD.print(i);
  LCD.print(" ");
  delay(1000);
}

    if (odpocitavani == 0)
      {
        odpocitavat = false;
        sejmuto = false;
        alarm = true;
      }
  }
  if (alarm)
  {
    do
    {
    tone(piezo, 900);
    digitalWrite(modra, HIGH);
    digitalWrite(bila, LOW);
    delay(150);
    digitalWrite(modra, LOW);
    digitalWrite(bila, HIGH);
    delay(150);
    } while(alarm == true);
  }
  delay(1000);
}
bool ctiSD()
{
    int tlacitkoHodnota = digitalRead(22);
    if (tlacitkoHodnota == HIGH)
    {
        digitalWrite(sdo, HIGH);

//uprava start
        int timeout = 999;//nastav si jaky chces, ale mel by byt mensi nez 1000 (1sec)
        while(!SD.begin(sd))
        {
            if(--timeout==0)
            {
                LCD.setCursor(0, 3);
                LCD.print("Karta neindikovana  ");
                break;
            }
            delay(1);
        }
        if(timeout==0)return false;//kdyz nenajde kartu vrati se zpet
        //nebo pokracuje
//uprava end
        File soubor = SD.open("pin.txt");
        if (soubor)
        {
            while(soubor.available())
            {
                text = char(soubor.read());
            }
            if (text == heslo)
            {
                digitalWrite(cervena, LOW);
                digitalWrite(zelena, HIGH);
                odpocitavat = false;
                alarm = false;
                sejmuto = false;
                LCD.setCursor(0, 3);
                LCD.print("Karta prijata.     ");
                return true;//uprava
            }
            else
            {
                LCD.setCursor(0, 3);
                LCD.print("Karta odmitnuta.");
                return false;//uprava
            }
        }
    }
}
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
8.1.2017 8:15
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.