Frage wegen VirtualWire.h 433Mhz Funkübertragung...

Guten Abend, habe eine Frage .Wer kann mir das hier genau erklären???
< pos=99;
msg[0]=map(pos,0,1023,0,1023);???
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Warte bis senden zu ende ist
delay(100); >

ist ein sende Sketch <VirtualWire.h> . Das Beispiel senden Zahlen von 0-100(funktioniert auch) ich möchte größere senden 10234 z.B. und weiß nicht was ich da ändern muss. Ich verstehe einfach nicht was da im Sketch passiert???
MFG

Die Länge des zu sendenden Textes kann durchaus länger sein. Wenn du deine Map-Funktion rausnimmst und nur ein char-array in entsprechender Länge übergibst, wirst du sehen, es funktioniert.. Danach solltest du die Map-Funktion anpassen.

HotSystems: Danach solltest du die Map-Funktion anpassen.

Du meinst beim Empfänger????

parabello: Du meinst beim Empfänger????

Evtl. ja.

Dem Sender ist es erstmal egal, wie Lang die "Msg" ist, wenn das char-Array genug Platz hat.

Was möchtest du mit "map" erreichen ?

HotSystems: Evtl. ja.

Dem Sender ist es erstmal egal, wie Lang die "Msg" ist, wenn das char-Array genug Platz hat.

Was möchtest du mit "map" erreichen ?

Hmmm, mit "map" ......also ich möchte nicht als char sonder als Int oder byte senden, mit char habe ich das Problem dass ich das beim Empfänger umwandeln muss um die empfangenen Daten zu verarbeiten. 1-9 wird ja umgewandelt und als char gesendet. Oder sehe ich es Falsch.... z.B. ich habe 2 Empfänger da wollte ich verschiedene Daten senden . Empfänger1-->24(%)also nur zahl 24 und empfänger2--> 58, so jetzt müssen ja die Empfänger wissen das die erste zahl zu Emp.1 gehört und die zweite zu den zweiten. also dachte ich, ich setze einen Code zusammen aus 1100+24 wird zum ersten geschickt und 2200+58 zum zweiten. Also weiß jeder Empfänger ob er das empfangene verarbeiten soll oder nicht. Oder kannst du mir da was anderes raten.

ich habe vor paar Tage schon rumgespielt mit senden ,habe glaube ich gelesen das es nur in char versandet wird..... also ich kann keine int zahl als 2323 versenden b.z.w. empfangen um gleich mit den Daten zu rechnen, stimmt?

wollte eine steuerg für die Fußbodenheizung basteln....

Und das geht leider nicht. Der Sender kann nur char-Arrays (Strings) senden, das ist doch kein Problem.

Das musst du beim Empfänger trennen. Ich mache es bei mir auch so und setze zwischen die Werte einen ":" und danach selektiere ich im Empfänger. Z.B. so:

  char* Part0 = strtok(StringReceived, ":");                // Ersten Inhalt (Part0) vor : holen
  int Part1 = atoi(strtok(NULL, ":"));                      // zweiten Inhalt (Part1) vor : holen
  int Part2 = atoi(strtok(NULL, ":"));                      // dritten Inhalt (Part2) vor : holen

HotSystems:
Und das geht leider nicht.
Der Sender kann nur char-Arrays (Strings) senden, das ist doch kein Problem.

Das musst du beim Empfänger trennen.
Ich mache es bei mir auch so und setze zwischen die Werte einen “:” und danach selektiere ich im Empfänger.
Z.B. so:

  char* Part0 = strtok(StringReceived, ":");                // Ersten Inhalt (Part0) vor : holen

int Part1 = atoi(strtok(NULL, “:”));                      // zweiten Inhalt (Part1) vor : holen
  int Part2 = atoi(strtok(NULL, “:”));                      // dritten Inhalt (Part2) vor : holen

Danke werde es mal ausprobieren… was macht “atoi” ja und wie versendest du ?
so–>
msg[0]=(“123:123”);
vw_send((uint8_t *)msg, strlen(msg));
warum steht bei msg[0] die 0 und deklariert ist char msg[20]; ich kenne die bedeutungen nicht.

parabello: ich habe vor paar Tage schon rumgespielt mit senden ,habe glaube ich gelesen das es nur in char versandet wird..... also ich kann keine int zahl als 2323 versenden b.z.w. empfangen um gleich mit den Daten zu rechnen, stimmt?

wollte eine steuerg für die Fußbodenheizung basteln....

habe ich grad erst gelesen.

Richtig, es geht nur mit char Array (mein Post #5), aber du kannst es im Empfänger auch wieder in "int" wandeln.

So mache ich es auch, um bestimmte Funktionen zu nutzen.

parabello: Danke werde es mal ausprobieren.......

Wenn man das einmal drauf hat, ist es kein Problem.

hier mal meine Version zur Einzelraumregelung
Sender:

/* ATtiny_DS18B20_3_Funk_Sender_ID_VBat_T_delta.ino
 * Achtung BUG im Linker bei Sketches über 4 kB. Neuen Linker giebt es hier:https://github.com/TCWORLD/ATTinyCore/tree/master/PCREL%20Patch%20for%20GCC
 * Attiny Core Files von hier:https://code.google.com/p/arduino-tiny/
 * Bevor das Programm auf den Attiny übertragen wird, muß der Bootloader installiert werden
 * um den Attiny auf 8MHz zu Fusen
  
  5974 Bytes
  Bu.Kli.
  09.02.2014
Belegung des Attiny:
   1  (SS)PB5  |  \/  |  Vcc         8
   2 ADC3 PB3  |      |  PB2 (SCK)   7
   3      PB4  |      |  PB1 (MISO)  6
   4      GND  |      |  PB0 (MOSI)  5
8k Falsh, 512Bytes Ram
*/
#include <OneWire.h>
#include <VirtualWire.h> // bei verwendung von VirtualWire.h und JeeLib.h, die crc16.h
#include <JeeLib.h>      // von C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\util nach 
                         //C:\Program Files (x86)\Arduino\libraries\VirtualWire\util kopieren 
                         //und vorher die bestehende Datei umbenennen.

#undef abs
#undef double
#undef round

ISR(WDT_vect) {Sleepy::watchdogEvent();}
 
#define tx_Pin PB1          //auf dem ProMini 12
#define dallas_Data_Pin PB4 //auf dem ProMini 9
#define T_delta_Pin PB3     //auf dem ProMini 14
#define schlafzeit 59003    //zeit in ms, die der MC schlafen soll
char ID[5]="ID00"; //muß für jeden Sender fortlaufend einzeln vergeben werden von 00 bis xx
char UBat[5];
char Temp_ist[5];
char Temp_delta[5];
char line[22];
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int T_ist;
int T_delta;

OneWire  ds(dallas_Data_Pin); 
//___________________________________________________________________________________________________________________
int readVcc() {
  bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // AD-Wandler einschalten
  long result;
  // Read 1.1V reference against Vcc
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); //ATmega328
  #endif  

  delay(10); //warten bis sich die Referenzspannung eingestellt hat
  ADCSRA |= _BV(ADSC); 
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1093044L / result; // vcc = 1125300L / result;  //Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300
  ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // AD-Wandler ausschalten um Strom zu sparen
  return result;
}
//______________________________________________________________________________________________________________________
 void setup(void) {
   analogReference(INTERNAL);
    DDRB=6;//PB1 + PB2 als Ausgang setzen
    vw_setup(2000);
    vw_set_tx_pin(tx_Pin);
  }
//_______________________________________________________________________________________________________________________
void loop(void) {
    
  
   PORTB=4;//PB2 auf High setzen (Spannungsversorgung für den DS18B20 und den Sender)
   bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // AD-Wandler einschalten
   delay(10);
   T_delta=analogRead(T_delta_Pin); // Auslesen der Poti-Stellung
   ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // AD-Wandler ausschalten um Strom zu sparen
   
    //Dallas DS18B20 auslesen
    if ( !ds.search(addr)) {
    ds.reset_search();
    return;}
    ds.reset();
    ds.select(addr);
    ds.write(0x44,0);  // 0=ohne 1=mit parasite power
    delay(750);        // vielleicht sind 750ms genug
    present = ds.reset();
    ds.select(addr);    
    ds.write(0xBE);             
    for ( i = 0; i < 9; i++) {   
    data[i] = ds.read();}
    T_ist =  ((data[1] << 8) + data[0] );
      //Umwandlung Integer zu Char
      itoa(readVcc(),UBat,10);
      itoa(T_ist,Temp_ist,10);
      itoa(T_delta,Temp_delta,10);
        //Sendestring aufbereiten
        strcpy(line,ID);
        strcat(line,",");
        strcat(line,UBat);
        strcat(line,",");
        if (T_ist<1000){strcat(line,"0");}
        if (T_ist<100){strcat(line,"0");}
        if (T_ist<10){strcat(line,"0");}
        strcat(line,Temp_ist);
        strcat(line,",");
        if (T_delta<1000){strcat(line,"0");}
        if (T_delta<100){strcat(line,"0");}
        if (T_delta<10){strcat(line,"0");}
        strcat(line,Temp_delta);
    //Senden
    vw_send((uint8_t *)line, strlen(line)); 
    vw_wait_tx();      

    PORTB=0;//alle Ausgänge auf 0 setzen
      Sleepy::loseSomeTime(schlafzeit);  //Schlafzeit in ms max 60000
    
}

der Empfänger Code ist im Anhang als ZIP evtl kannst du es gebrauchen

Regelung_FBH_Empf_Mini_3_1_BK.zip (4.62 KB)

Danke.... für die Hilfe!!! hast du das Programm selber geschrieben???

Es wäre jetzt interessant für alle, wie du das Problem gelöst hast. Dann hilft es allen.

Danke.... für die Hilfe!!! hast du das Programm selber geschrieben???

ich vermute mal du meinst mich. Ja habe ich.

ich habe jetzt die Möglichkeit die du vorgeschlagen hast genommen--> char* Part0 = strtok(Datenempfang, ":"); // Ersten Inhalt (Part0) vor : holen int Part1 = atoi(strtok(NULL, ":")); // zweiten Inhalt (Part1) vor : holen int Part2 = atoi(strtok(NULL, ":"));

also funktioniert super. ich hatte vorher 2 String gesendet und um die beiden zu unterscheiden habe ich den Anfang abgefragt if (SensorData.substring(0,7) == "zimmer1") oder if (Datenempfang.substring(0,7) == "zimmer1")

dann kam der Rest ..... aber deine Lösung HotSystems finde ich komfortabler.

und das senden sah so aus --> snprintf(msg, 20, "Zimmer1=%d",temp ); vw_send((uint8_t *)msg, strlen(msg)); wie schon mal erwähnt ,ich hatte einige Zeit paar Sachen mit c-control gemacht und fand Workbench++ super, vor allem die Hilfe wo die ganze befehle erklärt wurden(deutsch),da ich kein Englisch in der Schule gehabt habe fällt es mir schwer, da durchzublicken.

Gibt es da so was ähnliches für Adriano, Referenz Überblick???

parabello: ich habe jetzt die Möglichkeiten die du vorgeschlagen hast genommen--> char* Part0 = strtok(Datenempfang, ":"); // Ersten Inhalt (Part0) vor : holen int Part1 = atoi(strtok(NULL, ":")); // zweiten Inhalt (Part1) vor : holen int Part2 = atoi(strtok(NULL, ":"));

also funktioniert super. ich hatte vorher 2 String gesendet und um die beiden zu unterscheiden habe ich den Anfang abgefragt if (SensorData.substring(0,7) == "zimmer1") dann kam der Rest ..... aber deine Lösung ardubu finde ich komfortabler.

Wen meinst du jetzt ?

HotSystems: Wen meinst du jetzt ?

HotSystems, du hast doch das vorgeschlagen.... mit Part0 u.s.w...... bin etwas durcheinandergeraten

parabello: HotSystems, du hast doch das vorgeschlagen.... mit Part0 u.s.w......

Ok, danke.

Du hattest aber in Post #13 meinen Code gelistet aber ardubu erwähnt. Daher die Nachfrage.

HotSystems: Ok, danke.

Du hattest aber in Post #13 meinen Code gelistet aber ardubu erwähnt. Daher die Nachfrage.

habs schon geändert :confused:

parabello: dann kam der Rest ..... aber deine Lösung HotSystems finde ich komfortabler.

ok, alles klar.

und das senden sah so aus --> snprintf(msg, 20, "Zimmer1=%d",temp ); vw_send((uint8_t *)msg, strlen(msg));

Wenn es funktioniert, alles gut.

.... vor allem die Hilfe wo die ganze befehle erklärt wurden(deutsch),da ich kein Englisch in der Schule gehabt habe fällt es mir schwer, da durchzublicken.

Gibt es da so was ähnliches für Adriano, Referenz Überblick???

Da kann ich dir weiterhelfen. Sieh mal hier: Arduino-Referenz

HotSystems: ok, alles klar.

Wenn es funktioniert, alles gut.

Da kann ich dir weiterhelfen. Sieh mal hier: Arduino-Referenz

HEHEHE Super das hat mir gefehlt, Besten Dank HotSystems .... ;)