Stránka 1 z 1

Arduino: Komunikácia medzi doskami

Napsal: 18 led 2020, 23:17
od Peter Kolok
Dobrý deň,
robím ročníkový projekt a vopred chcem povedať, že sa v programovaní moc nevyznám. Potreboval by som však vedieť, že ako donútiť komunikovať medzi sebou dosku ESP 8266 a Wemos D1 R1.

Doska esp8266 je na NodeMCU 1.0 a na ňom je displej Liquid Crystal(0x27, 20, 4) a snímač BMP 180. Doska Wemos D1 R1 má ku sebe zase pripojený DHT snímač.

Skúšal som: Zapojil som ich spôsobom: TX-RX, RX-TX, GND-GND. Dokázal som medzi sebou poslať len slovo a nič viac mi nefungovalo.

Chcem docieliť: Chcem aby doska Wemos D1 R1 odosielala informácie z DHT snímača do ESP-čka a odtiaľ rovno na displej.

Tu priložím môj kód prijímateľa:

Kód: Vybrat vše

#include <Arduino.h>
#include <Wire.h>

#include <BMP180I2C.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDRESS 0x77

//create an BMP180 object using the I2C interface
BMP180I2C bmp180(I2C_ADDRESS);
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  // put your setup code here, to run once:
        Serial.begin(9600);

        //wait for serial connection to open (only necessary on some boards)
        while (!Serial);

        Wire.begin();
  lcd.init();
  lcd.backlight();


        //begin() initializes the interface, checks the sensor ID and reads the calibration parameters.
        if (!bmp180.begin())
        {
                Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
                while (1);
        }

        //reset sensor to default parameters.
        bmp180.resetToDefaults();

        //enable ultra high resolution mode for pressure measurements
        bmp180.setSamplingMode(BMP180MI::MODE_UHR);
}


void loop() {

  // put your main code here, to run repeatedly:

        delay(1000);

        //start a temperature measurement
        if (!bmp180.measureTemperature())
        {
                Serial.println("could not start temperature measurement, is a measurement already running?");
                return;
        }

        //wait for the measurement to finish. proceed as soon as hasValue() returned true.
        do
        {
                delay(100);
        } while (!bmp180.hasValue());

        Serial.print("Temperature: ");
        Serial.print(bmp180.getTemperature());
        Serial.println(" degC");

        //start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure
        //measurement immediately after a temperature measurement.
        if (!bmp180.measurePressure())
        {
                Serial.println("could not start perssure measurement, is a measurement already running?");
                return;
        }

        //wait for the measurement to finish. proceed as soon as hasValue() returned true.
        do
        {
                delay(100);
        } while (!bmp180.hasValue());

        Serial.print("Pressure: ");
        Serial.print(bmp180.getPressure());
        Serial.println(" Pa");



  lcd.setCursor(0, 0);
  lcd.print("Teplota:");
  lcd.setCursor(9, 0);
  lcd.print((bmp180.getTemperature() ));
  lcd.setCursor(16, 0);
  lcd.print("degC");
  lcd.setCursor(0, 1);
  lcd.print("Tlak:");
  lcd.setCursor(6, 1);
  lcd.print((bmp180.getPressure()));
  lcd.setCursor(16, 1);
  lcd.print("Pa");
}
A toto je kod odosielatela:

Kód: Vybrat vše

#include "DHTesp.h"

#ifdef ESP32
#pragma message(THIS EXAMPLE IS FOR ESP8266 ONLY!)
#error Select ESP8266 board.
#endif

DHTesp dht;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)\tHeatIndex (C)\t(F)");
  String thisBoard= ARDUINO_BOARD;
  Serial.println(thisBoard);

  // Autodetect is not working reliable, don't use the following line
  // dht.setup(17);
  // use this instead:
  dht.setup(D13, DHTesp::DHT22); // Connect DHT sensor to GPIO 17
}

void loop()
{
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.print(dht.toFahrenheit(temperature), 1);
  Serial.print("\t\t");
  Serial.print(dht.computeHeatIndex(temperature, humidity, false), 1);
  Serial.print("\t\t");
  Serial.println(dht.computeHeatIndex(dht.toFahrenheit(temperature), humidity, true), 1);
}
Naozaj neviem ako by som to mal urobiť a za každú pomoc dakujem....

Re: Arduino: Komunikácia medzi doskami

Napsal: 19 led 2020, 10:07
od jankop
Já mám obecně problém řešit úlohy, které nedávají smysl. Máš dvě více méně shodná zařízení NODEMCU a WEMOS. Proč nezapojíš displej, BMP180 a DHT k jednomu nebo druhému? Ušetříš jeden modul a všechno zásadně zjednodušíš.
Jinak při zběžném pohledu jsem ze strany přijímače nenašel ani náznak pokusu o přijetí něčeho ze sériové linky. Je vcelku jasné, žes něco posbíral na webu a vložil do toho touhu, aby to fungovalo tak, jak si ty představuješ, ale to je málo.
Brání ti zadání úlohy to udělat všechno na jednom, na tom WEMOS ?

Re: Arduino: Komunikácia medzi doskami

Napsal: 19 led 2020, 12:46
od Peter Kolok
CIeľom mojej ročníkovej práce je urobiť to, aby tieto dosky medzi sebou komunikovali. Samozrejme že sa dajú tieto snímače napojiť na jedno zariadenie. Len bohužiaľ toto na moju prácu nestačí a musia tam byť prvky komunikácie.

Na koľko, ale neviem docieliť komunikáciu medzi posielaním hodnôt z jednej dosky do druhej, tak mi to rapídne sťažuje prácu.

Mám tu však odskúšané programy pre odosielateľa:

Kód: Vybrat vše

#include "DHTesp.h"

#ifdef ESP32
#pragma message(THIS EXAMPLE IS FOR ESP8266 ONLY!)
#error Select ESP8266 board.
#endif

DHTesp dht;
int Teplota[] = dht.getTemperature(); //String data

void setup() {
  // Begin the Serial at 9600 Baud
  Serial.begin(9600);
}

void loop() {
  Serial.write(Teplota); //Write the serial data
  delay(1000);
}
a prijímateľ

Kód: Vybrat vše

char Teplota[10]; //Initialized variable to store recieved data

void setup() {
  // Begin the Serial at 9600 Baud
  Serial.begin(9600);
}

void loop() {
  Serial.readBytes(mystr,5); //Read the serial data and store in var
  Serial.println(mystr); //Print data on Serial Monitor
  delay(1000);
}
Sú to síce len slová, ale aj tak nechápem tej teorií...

Re: Arduino: Komunikácia medzi doskami

Napsal: 19 led 2020, 14:48
od ondraN
Obecně, si vždy musíš hlídat, jestli ti už druhé zařízení něco poslalo, teprve potom to vzít a pracovat s tím. Na to slouží metoda available(). Zkus se podívat na arduino reference na Serial.available()
https://www.arduino.cc/reference/en/lan ... on/serial/
mimochoden, v příkladech najdeš i ukázku jak udělat komunikaci mezi dvěma arduiny. A pokud na druhém konci není arduino, ale něco se sériovým portem, je to úplně stejné. Zkus si to projít a pochopit, to ti dá víc, než tady mámit hotový kód.

Re: Arduino: Komunikácia medzi doskami

Napsal: 20 led 2020, 10:57
od Le-Ze

Kód: Vybrat vše

char inString[32];
int inCount;

void loop()
{
    inCount = 0;

    while (Serial.available() > 0)
    {
        inString[inCount] = Serial.read();
        delay(10);
        if (inString[inCount] == '\0') break;
        inCount++;
    }

    inString[inCount] = '\0';

    if (inCount > 0) {

        String MyString = inString;
        MyString.trim();
//-------------------------------------------------------------------------------------------
// a pak třeba
    if (MyString == "A001_rele0")  
    {
    }
   }

Re: Arduino: Komunikácia medzi doskami

Napsal: 27 led 2020, 20:07
od Peter Kolok
Ďakujem veľmi pekne! :-)