Arduino a bezdratove moduly 433Mhz

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#31 Příspěvek od Cowley »

Proste si do bunek vlozis rozlozene parametry k prenosu:
Treba bunka msg[s cislem]
[0] bude cislo teplomeru - nemusis prece posilat cely text teplomer1, ale jen 1,
[1] bude znamenko - 0 pro minus, 1 pro plus,
[2] budou desitky z namerene hodnoty teplomeru,
[3] budou jednotky,
[4] budou desetiny,
[5] budou setiny
[6] bude rezerva nebo treba C pro Celsius

Takze pro teplotu 23.56 z teplomeru 1 bude bunka vypadat 1 1 2 3 5 6 C
Pro teplotu -12,45 z teplomeru 2 bude bunka vypadat 2 0 1 2 4 5 C

V prijimaci se to pak zase vsechno slozi :)
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#32 Příspěvek od jiri255 »

hmm to vypada jednoduse, ale jak definuju, že to msg má rozkládat teplomer1() viz upravený program...

Kód: Vybrat vše

#include <VirtualWire.h>
#include <OneWire.h>   //knihovna pro teplomer

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;
OneWire  ds_1(9);  // čidlo 1

//--------------------------------zacatek teplomeru_1
float teplomer1() {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius_1, fahrenheit_1;
 
  if ( !ds_1.search(addr)) {
   // Serial.println("No more addresses.");
    Serial.println();
    ds_1.reset_search();
    delay(250);
    //return;
  }
 
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    //Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
    //  return;
  }
 
  ds_1.reset();
  ds_1.select(addr);
  ds_1.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  present = ds_1.reset();
  ds_1.select(addr);   
  ds_1.write(0xBE);         // Read Scratchpad

  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds_1.read();
    //Serial.print(data[i], HEX);
    Serial.print(" ");
  }

  Serial.println();

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius_1 = (float)raw / 16.0;
  fahrenheit_1 = celsius_1 * 1.8 + 32.0;

  float stupne_1 = celsius_1;
  return stupne_1;
   }
//------------------------------------konec teplomeru_1

void setup()
{
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);       // Bits per sec
    pinMode(led_pin, OUTPUT);
}

byte count = 1;

void loop()
{
   Serial.println(teplomer1());
  char msg[7] = {'h','e','l','l','o',' ','#'};

  msg[6] = count;
  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  vw_send((uint8_t *)msg, 7);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(1000);
  count = count + 1;
}
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#33 Příspěvek od jiri255 »

tak jsem se asi posunul o kousek dál tady je program, který umí odeslat jednu teplotu ve formátu TP:23.625 a přijímač ji přijme :D

Kód: Vybrat vše

// RF433 vysílač
#include <VirtualWire.h>
#include <OneWire.h>

OneWire  ds_1(9);  // čidlo 1

const int ONE_WIRE_BUS = 9; //DS18S20 Signal pin on digital 9
OneWire oneWire(ONE_WIRE_BUS); // on digital pin 9

//--------------------------------zacatek teplomeru_1
float teplomer1() {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius_1, fahrenheit_1;
 
  if ( !ds_1.search(addr)) {
   // Serial.println("No more addresses.");
    Serial.println();
    ds_1.reset_search();
    delay(250);
    //return;
  }
 
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    //Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
    //  return;
  }
 
  ds_1.reset();
  ds_1.select(addr);
  ds_1.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  present = ds_1.reset();
  ds_1.select(addr);   
  ds_1.write(0xBE);         // Read Scratchpad

  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds_1.read();
    //Serial.print(data[i], HEX);
    Serial.print(" ");
  }

  Serial.println();

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius_1 = (float)raw / 16.0;
  fahrenheit_1 = celsius_1 * 1.8 + 32.0;

  float stupne_1 = celsius_1;
  return stupne_1;
   }
//------------------------------------konec teplomeru_1



void setup() {
 
  Serial.begin(9600);
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  Serial.println("nastaveni setupu");

}

void loop() {

  float dTmp = teplomer1();

  Serial.println(dTmp);

  char buf[6];
  dtostrf(dTmp, 6, 3, buf);

  char Msg[9];
  strcpy(Msg, "TP:");

  strncat(Msg, buf, 6);

  // Send temp.
  for (int i = 0; i < 10; ++i)
  {
    vw_send((uint8_t *)Msg, strlen(Msg));
    Serial.println(Msg);
    vw_wait_tx();
    delay(300);
  }

  delay(10000);
}


čidlo ds18b20 je připojeno na pin 9 a data k vysílači jsou na pinu 12
připojeno k desce UNO

Tohle je program přijímače stejný jako předtím:

Kód: Vybrat vše

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

const int led_pin = 13;
const int transmit_pin = 12;
const int receive_pin = 11;
const int transmit_en_pin = 3;

void setup()
{
    delay(1000);
    Serial.begin(9600);   // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);    // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    pinMode(led_pin, OUTPUT);
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
   int i;

        digitalWrite(led_pin, HIGH); // Flash a light to show received good message
   // Message with a good checksum received, dump it.
   Serial.print("Got: ");
   
   for (i = 0; i < buflen; i++)
   {
       Serial.print(buf[i], HEX);
       Serial.print(' ');
   }
   Serial.println();
        digitalWrite(led_pin, LOW);
    }
}


Všechno je super jen ten přijímač to přijme v tom hex:

Kód: Vybrat vše

Got: 54 50 3A 32 33 2E 36 32 35

což je oněch TP:23.625, ale já bych to ještě potřeboval nějak v tom programu převést z hex na ascii :-( dokázal by někdo prosím poradit?
Uživatelský avatar
popopepe
Příspěvky: 553
Registrován: 26 říj 2005, 00:00

#34 Příspěvek od popopepe »

Tohle nefunguje?
místo Serial.print(buf[i], HEX);
Serial.print(buf[i], DEC);
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#35 Příspěvek od jiri255 »

tak už jsem to vyřešil celé :D v tom programu pro přijímač v té
části

Kód: Vybrat vše

 // Message with a good checksum received, dump it. 
   Serial.print("Got: ");
   
   for (i = 0; i < buflen; i++)
   {
       Serial.print(buf[i], HEX);
       Serial.print(' ');
   }
   Serial.println();
        digitalWrite(led_pin, LOW);
    }
}


je potřeba ji změnit takto:

Kód: Vybrat vše

 // Message with a good checksum received, dump it. 
   Serial.print("Got: ");
   
   for (i = 0; i < buflen; i++)
   {
       Serial.write(buf[i]); //takhle se to vypíše správně, jak má ;-)
   }
   Serial.println();
        digitalWrite(led_pin, LOW);
    }
}


a teď už se mi na přijímači zobrazuje TP:23.650 třeba ;-)

Takže tohle by bylo super funguje to přesně, jak jsem potřeboval,
ale má to další problém :-(
Mám u vysílače i přijímače naletován drát 23cm a zkoušel jsem dosah
těch dvou modulů a je to k mému překvapení jen 1,5m, jak se posunu dál, tak už to data nepřijímá :-( což je absolutně k ničemu:-(
Nevíte někdo jak zvýšit dosah případně výkon vysílače nebo spíš asi přijímače?
V popisu bylo, že přijímač i vysílač mají mít 5V napájení? Nevíte někdo k čemu přesně slouží ten šroub na přijímači?
Uživatelský avatar
popopepe
Příspěvky: 553
Registrován: 26 říj 2005, 00:00

#36 Příspěvek od popopepe »

Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#37 Příspěvek od jiri255 »

tak nevim :-( předtím jsem tam měl měkký drát 23cm a podle toho odkazu jsem to předělal na 17cm dlouhý tvrdý drát 0,5mm a dosah je úplně stejný, jako předtím dál jak 2m se nedostanu.
V tom popisu té prutové antény není uvedeno, jaký ten drát má mít průměr a předpokládám měděný?
Podle toho popisu tedy delší anténa je spíše problém?
Teď jsem k tomu drátu přijímače ještě přicvaknul krokodýlem měkký drát 50cm celkem tedy 67cm a dosah se mi zvýšil na cca 4m, tak to mi ten popis u těch antén nějak nesedí.....
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#38 Příspěvek od jiri255 »

napadlo mě ještě, že by mohl být problém s těmi moduly, mám ještě jednou ty stejné a naletoval jsem k nim také 17cm dlouhý drát, ale výsledek je úplně stejný 2m a s připnutým drátem 4m, víc nic větší dosah to prostě nemá.
Na nějakých fórech psali přijímač napájet na 3V, ale to je taky k ničemu dosah je pořád stejně mizerný :-(
Nemá někdo s těmito moduly zkušenost, nepoužívá je k přenosu teploty?
Už nevím co s tím :-( data to posílá, ale ten dosah je nepoužitelný...
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#39 Příspěvek od MiloPS3 »

co ti z toho leze na strane primace ? mozna sou ty data posunuty , nevidim tam nikde zadny sinchronizacni data .... ?
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#40 Příspěvek od jiri255 »

na vysilaci vidim, ze odeslo napr: 10x TP:23.652 a na prijimaci vidim, ze to stejne prislo 10x TP:23.652 a tak porad dokola, ale tohle funguje jen max do 4m dal ne... vic, jak 4m uz je serial na prijimaci cisty, nic uz se tam nezobrazi
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#41 Příspěvek od Atlan »

Tak najpr pri poj osfiloskop na ten prij8macna uvid8me ci tam nechytas rusenie z nejakeho zdroja, polske impulzaky pre halogeny su radost. Alebo pripojit voltmeter a merat ake napatie mas na vystupe prijimaca, vyst v9n do prirody a zmerat to tam ci bede rozdiel. A synchronizovat by si to mal vysial sa tusim AAh hladaj na nete. Myslim z3 na mccontrolers fore sa to riesilo.
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#42 Příspěvek od MiloPS3 »

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“