Práce s přijatou proměnnou
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.
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.
Práce s přijatou proměnnou
Dobrý den, zajímalo by mě, jestli jde nějakým způsobem přijatá data z jiného arduina napodmínkovat… Myslím to tak, že si na jednom arduinu měřím kvalitu ovzduší pomocí mq135 a na druhém si to přes rfm69 přijímám. Šlo by nějak, aby ta ppm hodnota, co mi dojde, šla jako proměnná dát do programu na přijímači? Představoval bych si, že bych si dal nějakou takovou podmínku: if(("%d > 1000", (int)ppm) && ("%d < 2000", (int)ppm)){setColor(255, 0, 0);delay(100);setColor(0, 0, 0);delay(100);}, ale je mi jasné, že mi to arduino nepozná, co to vlastně ten int ppm je... Takže hlavní otázka, můžu si nějak deklarovat proměnou, jejíž hodnoty přijímám? Děkuji moc za pomoc!
Re: Práce s přijatou proměnnou
https://www.arduino.cc/reference/en/lan ... ons/toint/
https://www.arduino.cc/en/Tutorial.StringToIntExample
čili načteš normálně do řetězce, překlopíš na int (long), použiješ ...
https://www.arduino.cc/en/Tutorial.StringToIntExample
čili načteš normálně do řetězce, překlopíš na int (long), použiješ ...
Kód: Vybrat vše
long Ippm=ppm.toInt();
if ((Ippm>1000) && (Ippm <2000)) { setColor ...
Re: Práce s přijatou proměnnou
Děkuji, ale myslím že jsem se špatně vyjádřil... Takhle vypadá kód, který jsem zatím splácal jako přijímač:
A takhle vypadá vysílač:
Jak mám udělat, abych si mohl to ppm načíst jako proměnou v přijímači? Děkuji moc za ochotu, zkoušel jsem to hledat, ale marně a mám pocit, že už jsem spíše jenom zmatený
Kód: Vybrat vše
//Include the required libraries
#include <qbcan.h>
#include <Wire.h>
#include <SPI.h>
int redPin= 7;
int greenPin = 6;
int bluePin = 5;
int bzucak = 4;
//Radio Parameters
#define NODEID 1 //unique for each node on same network
#define NETWORKID 100 //the same on all nodes that talk to each other
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
#define FREQUENCY RF69_433MHZ
//Radio object
RFM69 radio;
bool promiscuousMode = false; //set to 'true' to sniff all packets on the same network
//bool promiscuousMode = true;
void setup()
{
//Initialize serial connection for debugging
Serial.begin(9600);
Serial.println("REBOOT");
//Delay to give time to the radio to power up (is it really needed?)
delay(1000);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
//Initialize radio
radio.initialize(FREQUENCY,NODEID,NETWORKID);
radio.setHighPower(); //To use the high power capabilities of the RFM69HW
radio.encrypt(ENCRYPTKEY);
radio.setFrequency(433102000); // nastavení kmitočtu 433.102 MHz
Serial.println("Transmitting at 433.102 MHz");
delay(1000);
// nastavení propojovacího pinu jako výstupního
pinMode(bzucak, OUTPUT);
// vzhledem k tomu, že náš bzučák je
// aktivní v nule, tedy LOW, je nutné
// ho po dohrání nastavit na vysokou
// úroveň, aby jsme zamezili bzučení
// v pauzách
digitalWrite(bzucak, HIGH);
}
byte ackCount=0;
uint32_t packetCount = 0;
void loop()
{
if (radio.receiveDone())
{
Serial.print( radio.SENDERID );
Serial.print("#[");
Serial.print(++packetCount);
Serial.print(']');
Serial.print('[');Serial.print(radio.SENDERID, DEC);Serial.print("] ");
if (promiscuousMode)
{
Serial.print("to [");Serial.print(radio.TARGETID, DEC);Serial.print("] ");
}
for (byte i = 0; i < radio.DATALEN; i++)
Serial.print((char)radio.DATA[i]);
Serial.print(" [RX_RSSI:");Serial.print(radio.RSSI);Serial.print("]");
if (radio.ACKRequested())
{
byte theNodeID = radio.SENDERID;
radio.sendACK();
Serial.print(" - ACK sent.");
// When a node requests an ACK, respond to the ACK
// and also send a packet requesting an ACK (every 3rd one only)
// This way both TX/RX NODE functions are tested on 1 end at the GATEWAY
if (ackCount++%3==0)
{
Serial.print(" Pinging node ");
Serial.print(theNodeID);
Serial.print(" - ACK...");
delay(3); //need this when sending right after reception .. ?
if (radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0)) // 0 = only 1 attempt, no retries
Serial.print("ok!");
else Serial.print("nothing");
}
}
Serial.println();
}
/*setColor(255, 0, 0); // Red Color
delay(1000);
setColor(0, 255, 0); // Green Color
delay(1000);
setColor(0, 0, 255); // Blue Color
delay(1000);
setColor(255, 255, 255); // White Color
delay(1000);
setColor(170, 0, 255); // Purple Color
delay(1000);*/
if((Ippm>1000) && (Ippm <2000)){
setColor(255, 0, 0);
delay(100);
setColor(0, 0, 0);
delay(100);
}
else{
setColor(0, 255, 0);
delay(100);
setColor(0, 0, 0);
delay(100);
}
// v nekonečné smyčce for, která proběhne
// pro hodnoty i 1 až 10, se vždy zavolá
// funkce zahraj, která zahraje zvuk o
// nastavené frekvenci a délce zadané ve tvaru
// zahraj(frekvence, doba), kde frekvence
// je v Hertzech a doba v milisekundách
for (int i=1; i < 11; i++) {
// frekvence se rovná i-násobku 100,
// zde tedy bude v rozsahu 100 až 1000 Hz,
// doba hraní je pak 50 milisekund
zahraj(100*i, 50);
// po každé frekvenci následuje pauza 250 ms
// pro rozeznání frekvencí
delay(250);
}
// pauza 2 vteřiny pro rozeznání konce smyčky
delay(2000);
}
void setColor(int redValue, int greenValue, int blueValue) {
analogWrite(redPin, redValue);
analogWrite(greenPin, greenValue);
analogWrite(bluePin, blueValue);
}
void zahraj(int frekvence, int doba) {
// funkce tone má na prvním místě pin
// s připojeným bzučákem, na druhém
// frekvenci hraného zvuku a na třetím
// dobu hraní zvuku v milisekundách;
// maximální frekvence je 65535 Hz,
// pro člověka neslyšitelná frekvence
tone(bzucak, frekvence, doba);
delay(doba);
digitalWrite(bzucak, HIGH);
}
A takhle vypadá vysílač:
Kód: Vybrat vše
//Include the required libraries
#include <qbcan.h>
#include <Wire.h>
#include <SPI.h>
#include "MQ135.h"
//Pressure sensor object
BMP180 bmp;
//Radio Parameters
//#define NODEID 2 //unique for each node on same network
#define NODEID 2
#define NETWORKID 100 //the same on all nodes that talk to each other
#define GATEWAYID 1 //Receiving node
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
#define pinA A0
#define pinD 7
MQ135 senzorMQ = MQ135(pinA);
//Radio object
char payload[50];
RFM69 radio;
void setup()
{
//Initialize serial connection for debugging
Serial.begin(9600);
Serial.println("REBOOT");
// Initialize pressure sensor.
if (bmp.begin())
Serial.println("BMP180 init success");
else
{
//In case of error let user know of the problem
Serial.println("BMP180 init fail (disconnected?)\n\n");
while(1); // Pause forever.
}
attachInterrupt(digitalPinToInterrupt(pinD), prerus, RISING);
//Initialize radio
radio.initialize(FREQUENCY,NODEID,NETWORKID);
radio.setHighPower(); //To use the high power capabilities of the RFM69HW
radio.encrypt(ENCRYPTKEY);
radio.setFrequency(433102000); // nastavení kmitočtu 433.102 MHz
Serial.println("Transmitting at 433.102 MHz");
delay(1000);
}
void loop()
{
double T,P;
// Get a new pressure reading:
bmp.getData(T,P);
float ppm = senzorMQ.getPPM();
// načtení času od spuštění Arduina v sekundách
long cas = millis()/1000;
// vytištění naměřené koncentrace
Serial.print("Koncentrace plynů: ");
Serial.print(ppm);
Serial.print(" ppm | cas od spusteni Arduina: ");
Serial.print(cas/60); // výpočet minut - dělení 60
Serial.print("m");
Serial.print(cas%60); // výpočet vteřin - zbytek po dělení 60
Serial.println("s.");
// pauza před dalším měřením
delay(3000);
//Display data
Serial.print("Absolute pressure: ");
Serial.print(P,2);
Serial.println(" mb.");
Serial.print("Temperature: ");
Serial.print(T,2);
Serial.println(" deg C.");
//Send Data
sprintf(payload,"T: %d C, P: %d mb., ppm: %d ",(int)T,(int)P,(int)ppm);
Serial.println(payload);
radio.send(GATEWAYID, payload, 30);
Serial.println("Send complete");
delay(500);
}
void prerus() {
// vypiš varovnou hlášku, pokud je aktivován digitální vstup
Serial.println("Detekovano prekroceni hranice!");
}
Jak mám udělat, abych si mohl to ppm načíst jako proměnou v přijímači? Děkuji moc za ochotu, zkoušel jsem to hledat, ale marně a mám pocit, že už jsem spíše jenom zmatený
Re: Práce s přijatou proměnnou
Jestli to dobre chapu, tak
by melo na Serial vypsat tu radku s tim ppm, co posila vysilac tady:
cili by se ti na seriovem monitoru melo objevit neco jako
takze si to pri prijimani zaroven ulozis do promenne (nebo budes pracovat s tim bufferem radio.DATA[]) a najdes v tom to "ppm:" a ty znaky za nim das do retezce a ten prevedes na int (stejne jako s teplotou a tlakem)
Jinak zkus do googlu zadat "rfm69 arduino example" a vyhodi to kopec prikladu. A rovnou tam zadej i "arduino práce s řetězci" nebo tak neco a zase najdes radu prikladu.
Prichazeji ti znaky - udelas retezec - z retezce vytahnes zajimave casti - prevedes na cisla - cisla zpracujes ...
Kód: Vybrat vše
if (radio.receiveDone())
{
...
for (byte i = 0; i < radio.DATALEN; i++)
Serial.print((char)radio.DATA[i]);
Kód: Vybrat vše
//Send Data
sprintf(payload,"T: %d C, P: %d mb., ppm: %d ",(int)T,(int)P,(int)ppm);
Serial.println(payload);
radio.send(GATEWAYID, payload, 30);
Kód: Vybrat vše
T:25 C, P:2345 mb., ppm:1234
Jinak zkus do googlu zadat "rfm69 arduino example" a vyhodi to kopec prikladu. A rovnou tam zadej i "arduino práce s řetězci" nebo tak neco a zase najdes radu prikladu.
Prichazeji ti znaky - udelas retezec - z retezce vytahnes zajimave casti - prevedes na cisla - cisla zpracujes ...
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 18 hostů