Stránka 2 z 2

Re: uprava kodu

Napsal: 19 úno 2019, 10:05
od fidos
Chtel bych se zeptat, proc vlastne nefunguje tento kod pro vysilac s kodem pro prijimac viz. nize ?
Jedna se jiny typ prenosu?
Nebo je vysilaci cas prilis kratky a prijimac "nestihne" zareagovat ?

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
  }
}
s timto?

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);
      }
    }
  }
  }

Re: uprava kodu

Napsal: 19 úno 2019, 11:31
od pavel1tu
Já nevím,
- je na to opravdu spousta příkladů
- ignorujete, že rychlost 4000 j emoc, i v příkladech doporučují 2000

Na kodu dle příkladů snad nic nechybí, i když nechápu proč si tam nedáte nějaký odposlech na seriovém portu co se vlastně přijímá....

Jako v příkladu

Kód: Vybrat vše

        
for (i = 0; i < buflen; i++)        
     {
     Serial.print(buf[i], HEX);
     Serial.print(" ");        
     }
     Serial.println("");

Re: uprava kodu

Napsal: 19 úno 2019, 12:29
od pavel1tu
co tohle ?
to mi asi fungovalo, myslím že by to mělo fungovat i když arduina propojíš jen dráty mezi sebou

Kód: Vybrat vše

for (i = 0; i < buflen; i++)
	{
	if(buf[i] == '1')
           {
           tady rozsvítit u led
           }
     }
Taky je mi divné, že odesíláš text "Je tam !" a čekáš že přijmeš "1" ?

Re: uprava kodu

Napsal: 27 úno 2019, 00:06
od fidos
Rychlosti jsem zkousel snizovat i zvysovat.
Odposlech ukazuje, ze vysilac i prijimac mezi sebou komunikuji - prijme hodnotu napr. "1", jak je nastaveno. Ale nerozsviti se ledka na prijimaci, kdy ja potrebuji - na zacatku a na konci periody. Nevim kde v kodu na prijimaci je chyba? Jsem laik, ale podle me by to melo pri prijmuti "1" rozsvitit led na pinu 13. Proc to nerozsvicuje? :)

kod pro vysilac :

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 1000 // 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 = "1"; // 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
  }
}
a tady pro prijimac (zkousel jsem ruzne verze kodu) :

Kód: Vybrat vše

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);
    vw_set_ptt_inverted(true);vw_set_rx_pin(12);
    vw_setup(1000);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);
      for (int i = 0; i < buflen; i++) {
      Serial.print((char)buf[i]);
    }
      Serial.println("");
      }
      else {
       digitalWrite(13,0);
      }
    }
  }
  

Re: uprava kodu

Napsal: 27 úno 2019, 07:23
od pavel1tu
Jak Vám to může na příjmu zobrazovat "1" ?

Kód: Vybrat vše

v podmínce máte if(buf[0]=='1') - ukazatel do buf na pozici "0"
ve sledování po sériové lince máte Serial.print((char)buf[i]); - ukazatel do buf na pozici "i"
tam je i blbost  ten (char) ....
i ta podmínka pro vyhodnocení je na blbém místě

zrušte ELSE - třeba ta LED jen krátce problikne a nevšimnete si toho

Re: uprava kodu

Napsal: 27 úno 2019, 23:54
od fidos
No nevim jak je to mozne, ale zobrazuje na odposlechu 1 :)
ELSE jsem vyhodil, ale nevidim bliknuti.
Podminka pro vyhodnoceni ma byt spravne kde?