uprava kodu

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
fidos
Příspěvky: 8
Registrován: 13 úno 2019, 14:01
Reputation: 0

uprava kodu

Příspěvek od fidos » 13 úno 2019, 15:57

Zdravim Vas

chtel bych se zeptat, jestli by mi nekdo mohl poradit s kodem, nejak se mi nedari dat to dohromady (jsem Arduino laik :)


Mam pir sensor, ten sepne a posila pres transmiter 433Mhz signal na prijimac.

Chtel bych to udelat tak, aby se po sepnuti pir, poslal signal a pote napr. 30 vterin prodleva, a pak zase poslal signal (kdyz je uz pir sensor vypnuty).


A pak zase dokola cekal na sepnuti pir.

Tady je muj zbastleny kod, ktery moc nefunguje :)

Kód: Vybrat vše

void loop(){
  int sensor = 8;
 
  if(digitalRead(sensor) == HIGH){
  controller="1"  ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx();
  digitalWrite(13,1);
  delay(10000);
   
  
  if(digitalRead(sensor) == LOW){
  controller="1"  ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx();
  digitalWrite(13,1);
  delay(2000);
  }
  } else{
  controller="0" ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx();
  digitalWrite(13,0);
  }
}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od jankop » 13 úno 2019, 17:32

Pořád říkám:"Když opisuješ, opisuj aspoň pozorně!"
Jsou věci, které ve sketchi nelze vynechat. Mimo jiné k nim patří nezbytná část:

Kód: Vybrat vše

void setup() {
  // put your setup code here, to run once:
}
Část programu, kterou níže přikládám, nezahrnuje vlastní odeslání hlášení, protože ti minimálně chybí nějaká knihovna, snad nějaká virtual wire. Tudíž úplně přesně nevím, co s tímhle:

Kód: Vybrat vše

      vw_send((uint8_t *)hlaseni, strlen(hlaseni));
      vw_wait_tx();
- ty řádky jsou možná správné, možná ne, opravdu bez hlubšího kontextu nevím.
zbastleny kod, ktery moc nefunguje
je sice vcelku přesné vyjádření, ale jaksi v něm chybí potřebné detaily.
Tady je můj návrh:

Kód: Vybrat vše

#include <interval.h> // knihovna pro periodicke deje
#define SENSOR 8      // definice pinu na kterem je senzor
#define LEDINT 13          // definice pinu s interni LED
#define SENSORPERIOD 100   // perioda cteni sensoru PIR je 100ms=0.1s
#define WAITPERIOD   10000 // doba cekani na odeslani druheho hlaseni je 10000ms=10s
bool controller = false;   // priznak akce z PIR detektoru
unsigned char hlaseni[] = "Je tam!"; // zde je mozne nastavit odesilany retezec
Interval ReadSensor;       // instance pro opakovane cteni sensoru
Interval WaitForResend;    // instance pro zpozdeni opakovaneho vysilani

void setup() {
  pinMode(SENSOR, INPUT);  // nsatveni vystupu
  pinMode(LEDINT, OUTPUT);
}

void loop() {
  // pokud vyprsel cas a necekas na druhe odeslani, tak precti sensor
  if (ReadSensor.expired() && !controller) {
    ReadSensor.set(SENSORPERIOD); // obnov nastaveni periody cteni sensoru
    if (digitalRead(SENSOR) == HIGH) {// Pokud je akce PIR
      digitalWrite(LEDINT, HIGH); // rozsvit interni LED
      controller = true ;         // nastav priznak
      //      vw_send((uint8_t *)hlaseni, strlen(hlaseni));
      //      vw_wait_tx();
      WaitForResend.set(WAITPERIOD);// nastav pro jednou periodu opakovaneho vysilani
    }
  }
  // Pokud vyprsel cas do druheho odeslani a je to treba
  if (WaitForResend.expired() && controller == true ) {
    controller = false ; // zrus priznak akce PIR
    //    vw_send((uint8_t *)hlaseni, strlen(hlaseni));
    //    vw_wait_tx();
    digitalWrite(LEDINT, LOW);// zhasni LED
  }
}
Ten sketch funguje tak, že periodicky 10x za sekundu čte stav pinu 8. V okamžiku kdy se na něm objeví stav HIGH, tak by se mělo odeslat první hlášení. Ale protože tomu chybí nějaká ta tvoje knihovna, tak se jen rozsvítí LED na Arduinu a spustí se časování pro druhé odeslání. To by mělo nastat za 10s, ale zase se nic nestane, jen ta LED na Arduinu zase zhasne. To si můžeš vyzkoušet, pokud máš připojen senzor, i bez odesílání, já použil tlačítko. Periodu čtení senzoru i dobu prodlevy mezi opakovaným vysíláním si v záhlaví sketche snadno nastavíš. Pokud v době mezi přijetím prvního alarmu a odesláním druhého hlášení přijde další alarm/alarmy, tak jsou prostě ignorovány. Knihovnu Interval nalezneš třeba zde https://github.com/Pablo2048/Interval

fidos
Příspěvky: 8
Registrován: 13 úno 2019, 14:01
Reputation: 0

Re: uprava kodu

Příspěvek od fidos » 14 úno 2019, 08:35

Diky moc za reakci.

Posilam jeste co mi v puvodnim kodu chybelo :

Kód: Vybrat vše

#include <VirtualWire.h>
char *controller;

void setup() {
  int sensor = 8;
  pinMode(sensor,INPUT);
  pinMode(13,OUTPUT);
  vw_set_ptt_inverted(true); 
  vw_set_tx_pin(12);
  vw_setup(4000);
}

void loop(){
  int sensor = 8;
  
  if(digitalRead(sensor) == HIGH){
  //You can add a for loop here to take multiple shots
  controller="1"  ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx(); 
  digitalWrite(13,1);
  delay(6000);
    
   
  if(digitalRead(sensor) == LOW){
  //You can add a for loop here to take multiple shots
  controller="1"  ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx(); 
  digitalWrite(13,1);
  delay(2000);
  } 
  } else{
  controller="0" ;
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx(); 
  digitalWrite(13,0);
  }
}



Co mi schazi u tohoto kodu, ze trasmitter nekomunikuje s recieverem?

Kód: Vybrat vše

#include <VirtualWire.h>
#include <interval.h> // knihovna pro periodicke deje
#define SENSOR 8      // definice pinu na kterem je senzor
#define LEDINT 13          // definice pinu s interni LED
#define SENSORPERIOD 100   // perioda cteni sensoru PIR je 100ms=0.1s
#define WAITPERIOD   10000 // doba cekani na odeslani druheho hlaseni je 10000ms=10s
bool controller = false;   // priznak akce z PIR detektoru
unsigned char hlaseni[] = "Je tam!"; // zde je mozne nastavit odesilany retezec
Interval ReadSensor;       // instance pro opakovane cteni sensoru
Interval WaitForResend;    // instance pro zpozdeni opakovaneho vysilani

void setup() {
  pinMode(SENSOR, INPUT);  // nsatveni vystupu
  pinMode(LEDINT, OUTPUT);
  vw_set_ptt_inverted(true); 
  vw_set_tx_pin(12);
  vw_setup(4000);
}

void loop() {
  
  // pokud vyprsel cas a necekas na druhe odeslani, tak precti sensor
  int sensor = 8;
  if (ReadSensor.expired() && !controller) {
    ReadSensor.set(SENSORPERIOD); // obnov nastaveni periody cteni sensoru
    if (digitalRead(SENSOR) == HIGH) {// Pokud je akce PIR
      digitalWrite(LEDINT, HIGH); // rozsvit interni LED
      controller = true ;         // nastav priznak
      vw_send((uint8_t *)hlaseni, strlen(hlaseni));
      vw_wait_tx();
      WaitForResend.set(WAITPERIOD);// nastav pro jednou periodu opakovaneho vysilani
    }
  }
  // Pokud vyprsel cas do druheho odeslani a je to treba
  if (WaitForResend.expired() && controller == true ) {
    controller = false ; // zrus priznak akce PIR
    vw_send((uint8_t *)hlaseni, strlen(hlaseni));
    vw_wait_tx();
    digitalWrite(LEDINT, LOW);// zhasni LED
  }
}

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od Axamith » 14 úno 2019, 11:49

Jedna technická poznámka, při vkládání kódu do fóra se používají tagy code (5 ikona zleva). Kód potom není na metry dlouhý a vypadá to potom takhle:

Kód: Vybrat vše

...
kód
...
EDIT BY ADMIN - vložil jsem značky CODE do předchozích příspěvků

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od jankop » 14 úno 2019, 11:59

Tak asi takhle -
Mám místo PIR připojené tlačítko a místo vysílače LED s rezistorem. Když zmáčknu tlačítko, tak LED blikne, respektive když nastavím nízkou přenosovou rychlost (třeba 50) tak vidím, že něco odesílá. Neprověřoval jsem odesílaný kód, předpokládám, že to je nějaký manchester, vcelku mě ten protokol nezajímá. Samozřejmě za 10s to blikne podruhé :-)
Pokud máš vysílač na správném výstupu a není vadný, tak to prostě něco vysílá. S tou LED si to snadno ověříš. Je také na tobě, abys nastavil na vysílači i přijímači stejný typ přenosu. Přenosová rychlost 4000 baudů je poměrně vysoká, zkusil bych výrazně nižší, pak můžeš zvyšovat. Celá věc je vcelku velmi jednoduchá a snadno odladitelná, tak se snaž. Variantou je třeba připojit LED s rezistorem na výstup přijímače pro detekci jestli to vůbec "něco" vysílá. Prostě takové příjemné hraníčko.
Hlavně se nám nezmiňuj o tom, jaký vysílač, přijímač či Arduino používáš, utaj všechny detaily HW i SW. Číňani jsou všude ... :D

Tohle mě prokazatelně vysílá

Kód: Vybrat vše

#include <VirtualWire.h>
#include <interval.h> // knihovna pro periodicke deje
#define SENSOR 8      // definice pinu na kterem je senzor
#define TRANSM 12     // definice pinu vysilace
#define LEDINT 13     // definice pinu s interni LED
#define BAUDRATE 4000 // nastaveni rychlosti prenosu vysilace
#define SENSORPERIOD 100 // perioda cteni sensoru PIR je 100ms=0.1s
#define WAITPERIOD 10000 // doba cekani na odeslani druheho hlaseni je 10000ms=10s
bool controller = false; // priznak akce z PIR detektoru
const char *hlaseni = "Je tam!"; // zde je mozne nastavit odesilany retezec
Interval ReadSensor; // instance pro opakovane cteni sensoru
Interval WaitForResend; // instance pro zpozdeni opakovaneho vysilani

void setup() {
  pinMode(SENSOR, INPUT); // nastaveni vystupu
  pinMode(LEDINT, OUTPUT);
  pinMode(TRANSM, OUTPUT);
  vw_set_ptt_inverted(true);
  vw_set_tx_pin(TRANSM);
  vw_setup(BAUDRATE);
}
void loop() {
  // pokud vyprsel cas a necekas na druhe odeslani, tak precti sensor
  if (ReadSensor.expired() && !controller) {
    ReadSensor.set(SENSORPERIOD); // obnov nastaveni periody cteni sensoru
    if (digitalRead(SENSOR) == HIGH) {// Pokud je akce PIR
      digitalWrite(LEDINT, HIGH); // rozsvit interni LED
      controller = true ; // nastav priznak
      vw_send((uint8_t *)hlaseni, strlen(hlaseni));
      vw_wait_tx();
      WaitForResend.set(WAITPERIOD);// nastav pro jednou periodu opakovaneho vysilani
    }
  }
  // Pokud vyprsel cas do druheho odeslani a je to treba
  if (WaitForResend.expired() && controller == true ) {
    controller = false ; // zrus priznak akce PIR
    vw_send((uint8_t *)hlaseni, strlen(hlaseni));
    vw_wait_tx();
    digitalWrite(LEDINT, LOW);// zhasni LED
  }
}

fidos
Příspěvky: 8
Registrován: 13 úno 2019, 14:01
Reputation: 0

Re: uprava kodu

Příspěvek od fidos » 14 úno 2019, 17:07

Zkousel jsem pripojit ledku na vysilac, blikne na zacatku a na konci - tak se zda, ze pracuje, jak ma. Rychlosti prenosu jsem zkousel menit, ale porad stejny. Je moznost nejak prodlouzit dobu vysilani vysilace? napr. 2 sekund? Jinak yysilac ani prijimac vadne nejsou, fungujou mi na jinem kodu.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od jankop » 14 úno 2019, 18:13

S tebou je teda domluva.
Máš stejnou přenosovou rychlost na vysílači i na přijímači?
Máš nastavený stejný stejný typ přenosu na vysílači i přijímači?
Zkusil's, jestli na výstupu přijímače je nebo není při vysílání signál, abys vyloučil chybu software přijímače?
Nemáš zapojený vysílač nebo přijímač na jiný pin, než je uvedeno v programu?
Co vlastně ten tvůj přijímač očekává? Jaký je jeho software?
Dobu vysílání samozřejmě prodloužit jde. Buď snížením rychlosti přenosu nebo prodloužením pole znaků.

Kód: Vybrat vše

const char *hlaseni = "Je tam!";
Přiznám se, že dost dobře nechápu, co je tak složitého na dvaceti řádcích programu.
Dej sem kódy, který ti fungujou a kód přijímače, který ti nefunguje a je to.

fidos
Příspěvky: 8
Registrován: 13 úno 2019, 14:01
Reputation: 0

Re: uprava kodu

Příspěvek od fidos » 16 úno 2019, 10:08

Jak jsem uz psal jsem laik :)
Prenosove rychlosti mam stejne, jak jsem psal zkousel jsem je menit.
Vsechny pinu jsou zapojeny spravne.
Se snizenim rychlosti na vysilaci napr. na 50 se pri sepnuti pir senzoru ledka na 13 zasekne a sviti do nekonecna. Abych prodlouzil dobu vysilani je spravne toto? :

char hlaseni[15];


Prijimac ma delat jen to, ze prijme signal a rozsvit led na pin 13.

Kod meho prijimace :

Kód: Vybrat vše

#include <VirtualWire.h>

void setup()
{
    vw_set_ptt_inverted(true);vw_set_rx_pin(12);
    vw_setup(4000);vw_rx_start();unsigned int data = 0;   
    pinMode(13, OUTPUT);         
}
void loop(){

    uint8_t buf[VW_MAX_MESSAGE_LEN];uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)){
      if(buf[0]=='1'){
        digitalWrite(13,1);
         
      } else {     
      if(buf[0]=='0'){
       digitalWrite(13,0);
      }
    }
  }
  }

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od jankop » 16 úno 2019, 11:26

Následující kód by měl fungovat s tebou popsaným kódem přijímače tak, že při poplachu se na přijímači rozsvítí LED a po 10 sekundách je vysílačem vypnuta. Jinak řečeno, vysílač na přijímači LED zapne a v určený čas (teď po 10 sekundách) ji vypne.

Kód: Vybrat vše

/* knihovna virtual-wire pro vysilac */
#include <VirtualWire.h>
/* knihovna pro periodicke deje */
#include <interval.h>
/* definice pinu na kterem je senzor */
#define SENSOR 8
/* definice pinu vysilace */
#define TRANSM 12
/* definice pinu s interni LED */
#define LEDINT 13
/* nastaveni rychlosti prenosu vysilace */
#define BAUDRATE 4000
/* perioda cteni sensoru PIR je 100ms=0.1s */
#define SENSORPERIOD 100
/* doba cekani na odeslani druheho hlaseni je 10000ms=10s */
#define WAITPERIOD 10000
/* priznak akce z PIR detektoru */
bool AlarmActivated = false;
/* zde je mozne nastavit odesilany retezec */
const char *zapni = "1";
const char *vypni = "0";
/* instance pro opakovane cteni sensoru */
Interval ReadSensor;
/* instance pro zpozdeni opakovaneho vysilani */
Interval WaitForResend;

void setup() {
  /* definice vstupu pro sensor */
  pinMode(SENSOR, INPUT);
  /* definice vystupu pro integrovanou LED */
  pinMode(LEDINT, OUTPUT);
  /* definice vystupu pro vysilac */
  pinMode(TRANSM, OUTPUT);
  /* nastaveni typu prenosu */
  vw_set_ptt_inverted(true);
  /* nastaveni vystupu pro vysilac */
  vw_set_tx_pin(TRANSM);
  /* nastaveni komunikacni rychlosti */
  vw_setup(BAUDRATE);
}
void loop() {
  /* pokud vyprsel cas a necekas na druhe odeslani, tak precti sensor */
  if (ReadSensor.expired() && !AlarmActivated) {
    /* obnov nastaveni periody cteni sensoru */
    ReadSensor.set(SENSORPERIOD);
    /* pokud je akce PIR */
    if (digitalRead(SENSOR)) {
      /* rozsvit interni LED */
      digitalWrite(LEDINT, HIGH);
      /* nastav priznak akce PIR */
      AlarmActivated = true ;
      /* odeslani hlaseni */
      vw_send((uint8_t *)zapni, strlen(zapni));
      /* ceka, dokud neni odeslano cele hlaseni */
      vw_wait_tx();
      /* nastav dobu do druheho vysilani */
      WaitForResend.set(WAITPERIOD);
    }
  }
  /* Pokud vyprsel cas do druheho vysilani */
  if (WaitForResend.expired() && AlarmActivated) {
    /* zrus priznak akce PIR */
    AlarmActivated = false ;
    /* odeslani hlaseni */
    vw_send((uint8_t *)vypni, strlen(vypni));
    /* ceka, dokud neni odeslano cele hlaseni */
    vw_wait_tx();
    /* zhasni LED */
    digitalWrite(LEDINT, LOW);
  }
}

fidos
Příspěvky: 8
Registrován: 13 úno 2019, 14:01
Reputation: 0

Re: uprava kodu

Příspěvek od fidos » 17 úno 2019, 09:01

Ja bych prave potreboval, aby se po tech napr. 10 sekundach se opet rozsvitila led 13 na prijimaci (aby zkratka 2x sepla nebo blikla - na zacatku a na konci peridy 10ti sekund, idealne po dobu 2 sekund). Ten predchozi kod od tebe pro vysilac vlastne fungoval dobre (krom ty doby 2 sekund a ze nekomunikoval s prijimacem)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů