Arduino: Ersätta tecken i array för uppräkning

Permalänk
Medlem

Arduino: Ersätta tecken i array för uppräkning

Hej!

Jag försöker göra ett enkelt test med att skicka data med en FS1000A krets. Denna biten fungerar ganska bra ser det ut som men...

Jag lyckas inte ersätta ett tecken i mitt meddelande med en uppräknare som går från 1-8 och börjar där efter om på 1.

/* VirtualWire 1.15 modifyed by http:/567.dk to fit my setup Com speed 115200 transmit_en_pin = 3; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! Prints out ASCII !!!!!!!!!!!! !!!!!!!!!!!! You screen will act on the codes !!!!!!!!!!!! !!!!!!!!!!!! Advice DEBUG with reciver1_5_HEX !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ // transmitter.pde // // Simple example of how to use VirtualWire to transmit messages // Implements a simplex (one-way) transmitter with an TX-C1 module // // See VirtualWire.h for detailed API docs // Author: Mike McCauley (mikem@airspayce.com) // Copyright (C) 2008 Mike McCauley // $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $ #include <VirtualWire.h> const int led_pin = 13; const int transmit_pin = 2; const int receive_pin = 2; 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 pinMode(led_pin, OUTPUT); } byte count = 1; void loop() { // 0 1 2 3 4 5 6 7 8 9 10 11 char msg[12] = {'T','R','A','N','S','M','I','T',':','-','#','-'}; // replace chr 12 with count (#) digitalWrite(led_pin, HIGH); // Flash a light to show transmitting Serial.print("Sending, package: "); Serial.print(count); Serial.print(" - "); Serial.print(msg); Serial.print(" - "); msg[10] = count; Serial.println(msg); vw_send((uint8_t *)msg, 12); vw_wait_tx(); // Wait until the whole message is gone digitalWrite(led_pin, LOW); delay(1000); count = count + 1; if (count > 8) { count = 1; Serial.println(" "); } }

Dold text

Utskriften på skärmen blir följande:

Sending, package: 8 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 1 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 2 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 3 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 4 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 5 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 6 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 7 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 8 - TRANSMIT:-#- - TRANSMIT:-- Sending, package: 1 - TRANSMIT:-#- - TRANSMIT:--

Dold text

Det är alltså tänkt att # ska ersättas med en siffra 1-8.

På mottagarsidan finns följande:

/* VirtualWire 1.15 modifyed by http:/567.dk to fit my setup Com speed 115200 receive_pin = 3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! Prints out ASCII !!!!!!!!!!!! !!!!!!!!!!!! You screen will act on the codes !!!!!!!!!!!! !!!!!!!!!!!! Advice DEBUG with reciver1_5_HEX !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ // 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 = 3; const int transmit_en_pin = 5; 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("HEX : "); for (i = 0; i < buflen; i++) { Serial.print(buf[i], HEX); Serial.print(' '); } Serial.println(); Serial.print("ASCII: "); for (i = 0; i < buflen; i++) { Serial.print((char)buf[i]); Serial.print(" "); } Serial.println(); Serial.println(" ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ "); digitalWrite(led_pin, LOW); } }

Dold text

och det ger följande utskrift på skärmen:

___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 8 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 1 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 2 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 3 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 4 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 5 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 6 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 7 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 8 2D ASCII: T R A N S M I T : - - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 1 2D ASCII: T R A N S M I T : - -

Dold text

Jag har kollat på flera förslag / exempel och inser inte vad jag gör för fel?

Tacksam för lite hjälp på vägen.

Mvh
z

Edit 1:
Fixade glömd utskrift i spolier 2

Edit 2:
Lägger till mottagarkoden

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Hedersmedlem

Du har glömt att fylla i den andra spoilern eller menar du att de bara blir tomt?

Jag ser inte riktigt hur du tänkt ersätta något, menar du if-satsen där du kollar om count > 8?

Permalänk
Medlem

@zonar:

Du skickar en byte in i en char

byte count = 1;

char msg[12] = {'T','R','A','N','S','M','I','T',':','-','#','-'};

msg[10] = count;

byten har värdet [00000001], värdet [00000001] i char är oftast en special char, siffran 1 är t.ex. typ värde 49 tror jag dvs värdet [00110001].

Antingen castar du om den eller så ändrar du upplägget på hur lägger ihop det, normalt sett skulle jag inte t.ex. arbeta med det inom en initierad array, beroende på lösningar är det oftast massa overhead med copy array etc.
Skapa en Array med t.ex. {'T','R','A','N','S','M','I','T',':','-',}
skicka count som char om du har funktionen eller använd char direkt och ha en switch för att byta värde på den.
sedan skicka "-" direkt efter.

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem
Skrivet av Ferrat:

@zonar:

Du skickar en byte in i en char

byte count = 1;

char msg[12] = {'T','R','A','N','S','M','I','T',':','-','#','-'};

msg[10] = count;

byten har värdet [00000001], värdet [00000001] i char är oftast en special char, siffran 1 är t.ex. typ värde 49 tror jag dvs värdet [00110001].

Antingen castar du om den eller så ändrar du upplägget på hur lägger ihop det, normalt sett skulle jag inte t.ex. arbeta med det inom en initierad array, beroende på lösningar är det oftast massa overhead med copy array etc.
Skapa en Array med t.ex. {'T','R','A','N','S','M','I','T',':','-',}
skicka count som char om du har funktionen eller använd char direkt och ha en switch för att byta värde på den.
sedan skicka "-" direkt efter.

Hej!

Tack för svaret,

Jag provade även följande
ersatte:

msg[10] = count;

med följande:

msg[10] = char(count);

men jag ser inte att det gör någon skillnad.

Eller tänker jag fel igen nu?

Mvh
z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

Ah nu ser jag output, lite lättare, den verkar castat om automatiskt men

Serial.print("Sending, package: ");
Serial.print(count); <<-- Här skickar du count
Serial.print(" - ");
Serial.print(msg); <<-- här skickar du msg och
Serial.print(" - ");
msg[10] = count;
Serial.println(msg);

Testa ta bort allt det och skriv
Serial.print("Sending, package: - TRANSMIT:-");
Serial.print(count)
Serial.print("-")

??

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

Som tidigare nämnts så ser vi inte utskriften du försökt lägga upp.

Alltid vettigt att kolla på ett ASCII table när man håller på å skickar strängar; http://www.asciitable.com/
I spår på det som sagts tidigare i tråden bör värdet konverteras till ett ASCII värde för <count>.
I det här fallet så skulle jag göra:
msg[10] = count + 0x30;

@Ferrat
Jag tycker att det är lämpligt att jobba i en initierad array. Och som är fallet när du kommunicerar med en extern kontroller så är det antagligen ett måste att hela meddelandet skickas i en stöt (start-/stop-bitar som ligger i UART protokollet). Vill man spara overheaden så kan man i sådant fall deklarera char msg[12] som en global variabel inom source-filen, jag skulle inte splittra meddelandet.

Permalänk
Medlem

@Mazzza:
Fast han använder ju ändå massa andra splits i sin output som det är?

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Hedersmedlem
Skrivet av Mazzza:

msg[10] = count + 0x30;

Om man tycker att det är jobbigt att titta i tabeller kan man också kolla åt värdena med enkla citationstecken
msg[10] = count + '0';

Permalänk
Medlem

@Ferrat:

Nja. Du får skilja på debug print och det som verkligen skickas till enheten.
Serial.print() är för egen debugging, den skickas inte vidare.
vw_send() skickar meddelandet till extern kontroller.

Permalänk
Medlem

@Mazzza:
Fast outputen som han visar är det han skriver till serial, att sända en standardiserad string över uart är ju att kasta på extrem overhead när det han egentligen isf vill sända enbart är typ någon form av sändnings ID?

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem

@Ferrat:

Jo det stämmer att det är serial-outputen som visas och ja, det bygger på overhead.
Men tråden i sig gick inte ut på att designa om formatet av protokollet

Permalänk
Medlem

Hej igen och tack för input!

Syftet med detta är helt enkelt övande för att börja förstå mer. Målet är att ta en DS18S20 sensor och skicka temperaturer trådlöst.

Men för att lyckas springa måste jag lära mig att krypa....

Jag ser i HEX utskriften på mottagarsidan att den tycks skicka rätt på något sätt. Så, de förefaller vara ett problem att jag blandar och ger på formaten.

Jag såg förslag på HEX? listor men jag är lite osäker på hur jag ska implementera det och skulle gärna se lite handfast kod eller ett exempel för att jag ska hänga med och förstå problemet på riktigt och även lösningsförslag.

Mvh
z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av Mazzza:

Som tidigare nämnts så ser vi inte utskriften du försökt lägga upp.

Alltid vettigt att kolla på ett ASCII table när man håller på å skickar strängar; http://www.asciitable.com/
I spår på det som sagts tidigare i tråden bör värdet konverteras till ett ASCII värde för <count>.
I det här fallet så skulle jag göra:
msg[10] = count + 0x30;

@Ferrat
Jag tycker att det är lämpligt att jobba i en initierad array. Och som är fallet när du kommunicerar med en extern kontroller så är det antagligen ett måste att hela meddelandet skickas i en stöt (start-/stop-bitar som ligger i UART protokollet). Vill man spara overheaden så kan man i sådant fall deklarera char msg[12] som en global variabel inom source-filen, jag skulle inte splittra meddelandet.

@Mazzza
Detta verkar fungera!

Nu måste jag bara förstå varför det börjar fungera....

Det som tas emot blir nu på formen:

___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 35 2D ASCII: T R A N S M I T : - 5 - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___

Vilket stämmer med det som jag hade tänkt mig att ta emot.

Ett litet steg framåt som kan blir sort när jag även förstår innebörden!

Toppen tack!
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

@Mazzza
Detta verkar fungera!

Nu måste jag bara förstå varför det börjar fungera....

Det som tas emot blir nu på formen:

___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ HEX : 54 52 41 4E 53 4D 49 54 3A 2D 35 2D ASCII: T R A N S M I T : - 5 - ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___

Vilket stämmer med det som jag hade tänkt mig att ta emot.

Ett litet steg framåt som kan blir sort när jag även förstår innebörden!

Toppen tack!
/z

Ett heltal som siffran 5 har värdet 5, 0101 binärt. När du omvandlar det till en char med (char)value får du det tecken som motsvarar position '5' i ASCII-tabellen (förenklat, beror på stöd för encoding etc, men det är vad som händer här). ASCII-tecken 5 är enligt http://www.asciitable.com/ en "enquiry"-symbol, vad nu det är. Hur som helst verkar ditt system inte kunna representera det som text.

För att värdet 5 ska bli ett siffertecken att skriva ut behöver du på något sätt omvandla det. I tabellen ser vi att tecknet '5' har värde 53 decimalt, eller 0x35 hexadecimalt. Vi noterar även att tecknet '0' har värde 48 (0x30 hex), och att tecknena 0 till 9 ligger i rak obruten följd. Detta innebär att vi kan ta godtyckligt värde mellan 0 och 9 och lägga till 0x30 för att få motsvarande tecken.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tack för ett utförligt svar!

Nu tror jag att jag börjar se sammanhanget. Nu försöker jag på mig en hypotes som ni gärna får komma med synpunkter på.

När jag definierar

char msg[12] = {'T','R','A','N','S','M','I','T',':','-','#','-'};

så kommer de som fnuttarna ' ' att hjälpa till vid omvandlingen.

Men när jag själv ersätter '#'

msg[10] = 1

tolkas det som att jag sätter 0x1 HEX form till ett "start of heading" tecken. För att få rätt representation behöver jag därför addera 0x30 HEX och får då 0X31 på HEX form vilket betyder en vanlig 1 i char.

Då återkommer jag till '#'. Vilken innebörd har då dessa fnuttar när jag programmerar Arduino?

Mvh
z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk

I just det där sammanhanget betyder inte # något speciellt. Det är likvärdigt med de andra tecknen du har i din array, men eftersom du skriver över det tecknet skulle det kunna ha varit vilket tecken som helst. Gissningsvis är ditt exempel baserat på något skrivet av en amerikan är # ofta betyder 'number' och talar om att där skall det in en siffra.

Man programmerar Arduino i en begränsad version av C++. # är en signal att nästa nyckelord är till preprocessorn, som i #include.

Permalänk
Medlem
Skrivet av zonar:

Tack för ett utförligt svar!

Nu tror jag att jag börjar se sammanhanget. Nu försöker jag på mig en hypotes som ni gärna får komma med synpunkter på.

När jag definierar

char msg[12] = {'T','R','A','N','S','M','I','T',':','-','#','-'};

så kommer de som fnuttarna ' ' att hjälpa till vid omvandlingen.

Men när jag själv ersätter '#'

msg[10] = 1

tolkas det som att jag sätter 0x1 HEX form till ett "start of heading" tecken. För att få rätt representation behöver jag därför addera 0x30 HEX och får då 0X31 på HEX form vilket betyder en vanlig 1 i char.

Då återkommer jag till '#'. Vilken innebörd har då dessa fnuttar när jag programmerar Arduino?

Mvh
z

Precis. Alla tecken som innesluts av enkelcitationstecken är så kallade character literals: '1' betyder "ASCII-värdet av tecknet 1". Under huven representeras alla värden som binära tal, och kompilatorn omvandlar '1' till värdet 0x31. Det är därför '0' + 1 ger värdet 0x31.

Jag gissar att '#' inte har någon specifik innebörd för Arduinon; den symboliserar bara platsen där du som programmerare förväntas sätta in en siffra i den specifika strängen.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Kul med någon som håller på med ett likadant projekt som jag med trådlösa tempgivare. Baserar också mina på FS1000A sändare. Vad har du tänkt ha på mottagarsidan?

Permalänk
Medlem

@pelleplu
Jag är inte helt säker på vad det blir på mottagarsidan men jag hoppas på att kunna köra en Raspberry PI där. Alternativet är en Arduino som sedan seriellt skickar data till Pi. Jag är inte så sugen på att skaffa en nätverks-shield till Arduino då de är ganska dyra.

Jag har redan några Pi:s och det är enkelt att sätta upp en webserver med en databas och visualisera data.

Jag kör en lab-Pi sedan 1 år tillbaka med mySQL och Apache för att rita grafer på temperaturen i lab-rummet.

Dock märker jag att den har segat ner sig nu när databasen har blivigt för stor så... antignen får jag sampla mindre (15min nu) eller så får jag ta bort data som blir för gammal.

Att plotta all data sedan ett år tillbaka tar lätt 15 minuter...

/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

@pelleplu
Jag är inte helt säker på vad det blir på mottagarsidan men jag hoppas på att kunna köra en Raspberry PI där. Alternativet är en Arduino som sedan seriellt skickar data till Pi. Jag är inte så sugen på att skaffa en nätverks-shield till Arduino då de är ganska dyra.

Jag har redan några Pi:s och det är enkelt att sätta upp en webserver med en databas och visualisera data.

Jag kör en lab-Pi sedan 1 år tillbaka med mySQL och Apache för att rita grafer på temperaturen i lab-rummet.

Dock märker jag att den har segat ner sig nu när databasen har blivigt för stor så... antignen får jag sampla mindre (15min nu) eller så får jag ta bort data som blir för gammal.

Att plotta all data sedan ett år tillbaka tar lätt 15 minuter...

/z

Jag kör en Arduino UNO som mottagare som sedan skickar seriellt till en RPI via usb-serie gränssnittet, det fungerar mycket bra. Skickar in min data till Domoticz för visualisering och loggning. Mottagarkretsen som brukar säljas tillsammans med FS1000A är dock ganska dålig, fick mycket bättre räckvidd när jag bytte till en annan variant.

Permalänk
Medlem
Skrivet av pelleplu:

Jag kör en Arduino UNO som mottagare som sedan skickar seriellt till en RPI via usb-serie gränssnittet, det fungerar mycket bra. Skickar in min data till Domoticz för visualisering och loggning. Mottagarkretsen som brukar säljas tillsammans med FS1000A är dock ganska dålig, fick mycket bättre räckvidd när jag bytte till en annan variant.

Vilken mottagare körde du istället? Vad jag har läst så kunde man genom att komplettera med en antenn (17.3cm) få anständig räckvidd. Vad är dina erfarenheter då mina fortfarande sitter på samma breadboard?

En ny fråga:

Jag försöker köra VirtualWire och OneWire samtidigt och råkar ut för ett kompileringsproblem:

När jag kör:
Variant 1:

#include <OneWire.h> #include <VirtualWire.h> void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }

Kompileringsfel 1:

Arduino: 1.6.13 (Windows 10), Board: "Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)" libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `crc16_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `crc_xmodem_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `_crc_ccitt_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `_crc_ibutton_update(unsigned char, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2.exe: error: ld returned 1 exit status exit status 1 Error compiling for board Arduino Pro or Pro Mini.

Efter en hel del funderande så har jag ringat in att i bägge biblioteken anropar körs följande include:

#include <util/crc16.h>

och den tycks vara problemet. Om jag kommenterar bort denna så får jag istället problem med att det fattas moduler i respektive scope.

Hur löser man denna typer av problem?

Edit: fixade taggar och tackar för tagg:hjälp
Mvh
z

Lagade code-taggen och b-taggen
Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Hedersmedlem

Fixade dina taggar

Permalänk
Medlem
Skrivet av zonar:

Vilken mottagare körde du istället? Vad jag har läst så kunde man genom att komplettera med en antenn (17.3cm) få anständig räckvidd. Vad är dina erfarenheter då mina fortfarande sitter på samma breadboard?

En ny fråga:

Jag försöker köra VirtualWire och OneWire samtidigt och råkar ut för ett kompileringsproblem:

När jag kör:
Variant 1:

#include <OneWire.h> #include <VirtualWire.h> void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }

Kompileringsfel 1:

Arduino: 1.6.13 (Windows 10), Board: "Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)" libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `crc16_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `crc_xmodem_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `_crc_ccitt_update(unsigned int, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\VirtualWire\VirtualWire.cpp.o (symbol from plugin): In function `crc16_update(unsigned int, unsigned char)': (.text+0x0): multiple definition of `_crc_ibutton_update(unsigned char, unsigned char)' sketch\sketch_dec21b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2.exe: error: ld returned 1 exit status exit status 1 Error compiling for board Arduino Pro or Pro Mini.

Efter en hel del funderande så har jag ringat in att i bägge biblioteken anropar körs följande include:

#include <util/crc16.h>

och den tycks vara problemet. Om jag kommenterar bort denna så får jag istället problem med att det fattas moduler i respektive scope.

Hur löser man denna typer av problem?

Edit: fixade taggar och tackar för tagg:hjälp
Mvh
z

Testa att byta plats på dina includes, dvs

#include <VirtualWire.h> #include <OneWire.h>

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

@Teknocide:

God morgon och tack för förslaget! Det i kombination med att en kompis kom förbi och gav mig lite handfasta tips löste problemet.

I detta fallet uppstod problemet när jag importerade crc16.h och det visade sig finnas inte mindre än 3 olika stycken sådana filer i Arduino installationspaketet.

När jag inspekterade dem lite noggrannare var de dessutom olika med olika metoder/funktioner definierade.... Jag plockade den som innehöll rätt funktioner och la den bland mina egna bibliotek samt kommenterade bort inläsningen i OneWire samt VirtualWire-paketen. Började jag med att inkludera crc16.h före dessa paketen istället.

Efter detta gick det utmärkt att kompilera samt nu har jag lyckats skicka temperaturen trådlöst till mottagaren!

God jul och tack för hjälpen än en gång!

/Z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

Vilken mottagare körde du istället? Vad jag har läst så kunde man genom att komplettera med en antenn (17.3cm) få anständig räckvidd. Vad är dina erfarenheter då mina fortfarande sitter på samma breadboard?

Jag har antenner på båda sidor och använder mig av denna modul: https://www.aliexpress.com/item/RXB6-433Mhz-Superheterodyne-W...

Verkar finnas typ 2st olika modeller av mottagare när man kollar runt. Den som jag kör som har 8 pinnar och radiodelen i skärmad metallburk verkar vara något bättre än 4-pinnarsmodellen. Sen spelar spänningen på sändarsidan in, med 3V nådde jag knappt nedervåningen på huset, men med 4.5V var det inga problem (mottagern står på övervåningen).

Permalänk
Medlem
Skrivet av pelleplu:

Jag har antenner på båda sidor och använder mig av denna modul: https://www.aliexpress.com/item/RXB6-433Mhz-Superheterodyne-W...

Verkar finnas typ 2st olika modeller av mottagare när man kollar runt. Den som jag kör som har 8 pinnar och radiodelen i skärmad metallburk verkar vara något bättre än 4-pinnarsmodellen. Sen spelar spänningen på sändarsidan in, med 3V nådde jag knappt nedervåningen på huset, men med 4.5V var det inga problem (mottagern står på övervåningen).

Tack för återkopplingen!

Jag har nu hunnit leka lite mer och sändaren och mottagaren fungerar riktigt bra för mig med den billigaste varianten. Båda drivs på 5V i nuläget och sändaren med ett 9V batteri för testandet.

Testade att lägga in sändardelen i frysen en trappa ner och hade inga problem att ta emot signalen på övervåningen en bit bort. Fick lite problem med att jag behövde lägga in absolutbeloppet av temperaturen bara... annars räknade jag åt fel håll i hex-tabellen...

God jul!
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]