Stránka 3 z 3
Napsal: 05 pro 2015, 21:11
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

Napsal: 05 pro 2015, 21:26
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;
}
Napsal: 08 pro 2015, 17:22
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
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:
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?
Napsal: 08 pro 2015, 18:03
od popopepe
Tohle nefunguje?
místo Serial.print(buf[i], HEX);
Serial.print(buf[i], DEC);
Napsal: 08 pro 2015, 18:13
od jiri255
tak už jsem to vyřešil celé

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?
Napsal: 09 pro 2015, 08:17
od popopepe
Napsal: 12 pro 2015, 12:44
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í.....
Napsal: 12 pro 2015, 20:09
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ý...
Napsal: 13 pro 2015, 11:30
od MiloPS3
co ti z toho leze na strane primace ? mozna sou ty data posunuty , nevidim tam nikde zadny sinchronizacni data .... ?
Napsal: 13 pro 2015, 14:49
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
Napsal: 13 pro 2015, 15:37
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.
Napsal: 13 pro 2015, 19:03
od MiloPS3