Práce s přijatou proměnnou

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
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.
Odpovědět
IngKadlec
Příspěvky: 2
Registrován: 12 bře 2019, 18:16
Reputation: 0

Práce s přijatou proměnnou

Příspěvek od IngKadlec » 12 bře 2019, 18:21

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!

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Práce s přijatou proměnnou

Příspěvek od gilhad » 12 bře 2019, 20:14

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š ...

Kód: Vybrat vše

long Ippm=ppm.toInt();
if ((Ippm>1000) && (Ippm <2000)) { setColor ...


IngKadlec
Příspěvky: 2
Registrován: 12 bře 2019, 18:16
Reputation: 0

Re: Práce s přijatou proměnnou

Příspěvek od IngKadlec » 12 bře 2019, 20:59

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č:

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ý :D

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Práce s přijatou proměnnou

Příspěvek od gilhad » 12 bře 2019, 23:24

Jestli to dobre chapu, tak

Kód: Vybrat vše


  if (radio.receiveDone())
  {
...
    for (byte i = 0; i < radio.DATALEN; i++)
      Serial.print((char)radio.DATA[i]);
by melo na Serial vypsat tu radku s tim ppm, co posila vysilac tady:

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);
cili by se ti na seriovem monitoru melo objevit neco jako

Kód: Vybrat vše

T:25 C, P:2345 mb., ppm:1234
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 ...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů