Объединить 2 скетча

Андрей88
Offline
Зарегистрирован: 28.06.2017

Добрый вечер. В теме ардуино я совсем новичок.

Созрела идея сделать метеостанцию с передачей данных на народный мониторинг. До самой передачи данных еще далековато, т.к. банально пока что не получается объединить пару скетчей в 1.

Имеется 2 датчика BMP180 и SI7021. Все это прицепил на Arduino UNO. По отдельности каждый датчик свою функцию выполняет при помощи таких скетчей:

SI7021


// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// SI7021
// This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-...

#include <Wire.h>

// SI7021 I2C address is 0x40(64)
#define Addr 0x40

void setup()
{
  // Initialise I2C communication as MASTER
  Wire.begin();
  // Initialise serial communication, set baud rate = 9600
  Serial.begin(9600);

  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(300);
}

void loop()
{
  unsigned int data[2];
  
  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send humidity measurement command, NO HOLD MASTER
  Wire.write(0xF5);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);

  // Read 2 bytes of data
  // humidity msb, humidity lsb 
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }
    
  // Convert the data
  float humidity  = ((data[0] * 256.0) + data[1]);
  humidity = ((125 * humidity) / 65536.0) - 6;

  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send temperature measurement command, NO HOLD MASTER
  Wire.write(0xF3);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);
  
  // Read 2 bytes of data
  // temp msb, temp lsb
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data
  float temp  = ((data[0] * 256.0) + data[1]);
  float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
  float fTemp = cTemp * 1.8 + 32;
   
  // Output data to serial monitor
  Serial.print("Влажность : ");
  Serial.print(humidity);
  Serial.println(" % RH");
  Serial.print("Температура : ");
  Serial.print(cTemp);
  Serial.println(" C");
   delay(30000);
}

BMP180

 

#include <Wire.h>
#include <Adafruit_BMP085.h>

#define one_wire-bus 2

Adafruit_BMP085 bmp;
  
void setup() {
  Serial.begin(9600);
   if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
  }
}
  
void loop() {
    Serial.print("Temperature = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressure = mm Hg");
    Serial.print(bmp.readPressure());
    Serial.println(" mm Hg");
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" meters");

    Serial.print("Pressure at sealevel (calculated) = ");
    Serial.print(bmp.readSealevelPressure()/133.3);
    Serial.println(" mm");

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Real altitude = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" meters");
    
    Serial.println();
    delay(25000);
}

Объединить воедино никак не удается, на выходе или ошибки или же идут показания только от SI7021.

Вот что компилятор забраковал из последнего

// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// SI7021
// This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-...

#include <Wire.h>
#include <Adafruit_BMP085.h>

// SI7021 I2C address is 0x40(64)
#define Addr 0x40
#define one_wire-bus 2

Adafruit_BMP085 bmp;

void setup()
{
  // Initialise I2C communication as MASTER
  Wire.begin();
  // Initialise serial communication, set baud rate = 9600
  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Stop I2C transmission
  Wire.endTransmission();
  
  Serial.begin(9600);
  if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  
  delay(300);
}

void loop()
{
  unsigned int data[2];
  
  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send humidity measurement command, NO HOLD MASTER
  Wire.write(0xF5);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);

  // Read 2 bytes of data
  // humidity msb, humidity lsb 
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }
    
  // Convert the data
  float humidity  = ((data[0] * 256.0) + data[1]);
  humidity = ((125 * humidity) / 65536.0) - 6;

  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send temperature measurement command, NO HOLD MASTER
  Wire.write(0xF3);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);
  
  // Read 2 bytes of data
  // temp msb, temp lsb
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data
  float temp  = ((data[0] * 256.0) + data[1]);
  float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
  float fTemp = cTemp * 1.8 + 32;
   
  // Output data to serial monitor
  Serial.print("Влажность : ");
  Serial.print(humidity);
  Serial.println(" % RH");
  Serial.print("Температура : ");
  Serial.print(cTemp);
  Serial.println(" C");
}
 
exit status 1
a function-definition is not allowed here before '{' token
 
 

Буду признателен за любую помощь

okta
Offline
Зарегистрирован: 10.01.2015

Я вам сейчс очень мягко намекну что ошибка

a function-definition is not allowed here before '{' token

на уровне детского сада. И связана со строкой 35.

После этого - что вы там с датчиками могли напортачить даже смотреть не стал.

 

Андрей88
Offline
Зарегистрирован: 28.06.2017

это понятно, что строка 35, но вот что с этим делать никак не пойму. Эта строка выглядит точно так же как и в скетче для SI7021, но там ошибки нету.

okta
Offline
Зарегистрирован: 10.01.2015

Андрей, вы извините, но базовый синтаксис вам ни кто объяснять не будет. Это как программа начальной школы. Вы же в магазине не спрашиваете почему 2+2=4

Андрей88
Offline
Зарегистрирован: 28.06.2017
void loop()
{
  unsigned int data[2];
void loop()
{
  unsigned int data[2];

в чем разница между этими фрагментами кода?

Я собственно и не скрывал, что я ничего не понимаю, не хотите объяснить, зачем вообще чтото писать?

okta
Offline
Зарегистрирован: 10.01.2015

Визуально никакого.

okta
Offline
Зарегистрирован: 10.01.2015

Но в выложенном вашем первом посте разница есть.

Потому киайте что у вас сейчас)

Андрей88
Offline
Зарегистрирован: 28.06.2017

в выложенном коде я пытался жирным тегом подсветить проблемный участок, отсюда он и выглядит по другому

void loop()
<strong>{</strong>
unsigned int data[2];

Только что по новой перебрал вариант, о чудо оно запустилось, пока не успел сообразить как я это сделал)

// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// SI7021
// This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-0-product_tabset-2

#include <Wire.h>
#include <Adafruit_BMP085.h>

// SI7021 I2C address is 0x40(64)
#define Addr 0x40

Adafruit_BMP085 bmp;
void setup()
{
  // Initialise I2C communication as MASTER
  Wire.begin();
  // Initialise serial communication, set baud rate = 9600
  Serial.begin(9600);

  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(300);
}

void loop()
{
  unsigned int data[2];
  
  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send humidity measurement command, NO HOLD MASTER
  Wire.write(0xF5);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);

  // Read 2 bytes of data
  // humidity msb, humidity lsb 
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }
    
  // Convert the data
  float humidity  = ((data[0] * 256.0) + data[1]);
  humidity = ((125 * humidity) / 65536.0) - 6;

  // Start I2C transmission
  Wire.beginTransmission(Addr);
  // Send temperature measurement command, NO HOLD MASTER
  Wire.write(0xF3);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(500);
    
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);
  
  // Read 2 bytes of data
  // temp msb, temp lsb
  if(Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data
  float temp  = ((data[0] * 256.0) + data[1]);
  float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
  float fTemp = cTemp * 1.8 + 32;
   
  // Output data to serial monitor
  Serial.print("Влажность : ");
  Serial.print(humidity);
  Serial.println(" % RH");
  Serial.print("Температура : ");
  Serial.print(cTemp);
  Serial.println(" C");
  Serial.print("Temperature = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressure = mm Hg");
    Serial.print(bmp.readPressure());
    Serial.println(" mm Hg");
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" meters");

    Serial.print("Pressure at sealevel (calculated) = ");
    Serial.print(bmp.readSealevelPressure()/133.3);
    Serial.println(" mm");

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Real altitude = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" meters");
    
    Serial.println();
   delay(30000);
}

 

но давление стало вычислятся как то криво

 

если в объединенном коде добавлять строку из BMP180

 if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");

то появляется вышеуказанная ошибка

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Андрей88, объединить можне не любые два скетча, а только те, что допускают объединение.

Одним из ризнаков скетча, допускающего объединение с другими, является отсутствие delay().

У Вас delay() встречается в обоих скетчах, следовательно, объединить их нельзя.

 

Андрей88
Offline
Зарегистрирован: 28.06.2017

ну может не всегда это невозможно. Все таки получилось несколько иным способом

Для SI7021 нашел другой скетч с жк-дисплеем. При попытке выдрать из скетча ЖК-дисплей запускать его не удавалось. Пришлось качать библиотеку для жк-дисплея, чтобы компилятор не ругался. Потом приделал туда BMP-180. Вроде нормально считает теперь. С предыдущим скетчем так и не понял, почему давление стало криво считаться. В итоге вышло вот что

 


#include <Wire.h>
#include <SI7021.h>
#include <Adafruit_BMP085.h>

#include <LiquidCrystal_I2C.h>
SI7021 sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);

int temp1,hum1;
Adafruit_BMP085 bmp;
void setup()
{
lcd.begin();
Serial.begin(9600);
 if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Hello, world!");
}


void loop()
{
si7021_env data = sensor.getHumidityAndTemperature();
temp1=data.celsiusHundredths-data.celsiusHundredths/100*100;
hum1=data.humidityBasisPoints-data.humidityBasisPoints/100*100;

Serial.print("Температура ");
Serial.print(data.celsiusHundredths/100);
Serial.print(",");
Serial.print(temp1);
Serial.println("  C");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp ");
lcd.print(data.celsiusHundredths/100);
lcd.print(",");
lcd.print(temp1);
lcd.print("  C");

Serial.print("Относительная влажность ");
Serial.print(data.humidityBasisPoints/100);
Serial.print(",");
Serial.print(hum1);
Serial.println(" %");
Serial.println(" ");
lcd.setCursor(0,1);
lcd.print("Hum  ");
lcd.print(data.humidityBasisPoints/100);
lcd.print(",");
lcd.print(hum1);
lcd.print(" %");
 Serial.print("Температура = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressure = ");
    Serial.print(bmp.readPressure());
    Serial.println(" mm Hg");
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" meters");

    Serial.print("Pressure at sealevel (calculated) = ");
    Serial.print(bmp.readSealevelPressure()/133.3);
    Serial.println(" mm");

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Real altitude = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" meters");
    
    Serial.println();
delay(30000);
}

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

andriano пишет:

Андрей88, объединить можне не любые два скетча, а только те, что допускают объединение.

Одним из ризнаков скетча, допускающего объединение с другими, является отсутствие delay().

У Вас delay() встречается в обоих скетчах, следовательно, объединить их нельзя.

дык, запретил я хнёй заниматься ещё три года тому... 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Андрей88 пишет:

ну может не всегда это невозможно. 

Может быть.

Но подтверждающих примеров я еще не видел.

Цитата:

Все таки получилось несколько иным способом

Для SI7021 нашел другой скетч с жк-дисплеем.

У Вас какие-то проблемы с логикой. Если невозможно объединить два конкретные скетча, это совсем не значит, что нельзя объединить два других, написать все с нуля или сделать целую кучу промежуточных вариантов.