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

Re: uprava kodu

Příspěvek od fidos » 19 úno 2019, 10:05

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

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od pavel1tu » 19 úno 2019, 11:31

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("");
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od pavel1tu » 19 úno 2019, 12:29

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" ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: uprava kodu

Příspěvek od fidos » 27 úno 2019, 00:06

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

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: uprava kodu

Příspěvek od pavel1tu » 27 úno 2019, 07:23

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: uprava kodu

Příspěvek od fidos » 27 úno 2019, 23:54

No nevim jak je to mozne, ale zobrazuje na odposlechu 1 :)
ELSE jsem vyhodil, ale nevidim bliknuti.
Podminka pro vyhodnoceni ma byt spravne kde?

Odpovědět

Kdo je online

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