Проблемы с компилированием скетча

sharp-news
Offline
Зарегистрирован: 22.01.2015

Приветствую вас форумяне, вопрос наверняка копеешный, для знающих, пытаюсь реализовать (повторить) проект "управление отоплением в загородном доме (GSM)", с соседнего форума, имею там какую то неловкую проблему с регистрацией поэтому там спросить не получается;

собственно к проблеме.

скетч:

#include "DHT.h"
#include <SoftwareSerial.h>
#define DHTPIN 7    // pin на котором висит датчик температуры
#define DHTTYPE DHT22  // DHT 22 тип датчика
//Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
int greenLed = 13; //Зеленый светодиод на PIN13
int powerGSM = 6; //Пин включения GSM
int unit1 = 8; //Управляемое устройство 1
int unit2 = 9; //Управляемое устройство 2
int unit3 = 10;//Управляемое устройство 3
int unit4 = 11;//Управляемое устройство 4
int perimetr = 12;// Датчик периметра
String statusHome;
int t=0;
 
unsigned long currentTime;
unsigned long loopTime;
 
boolean unit1status = false; //Управляемое устройство 1
boolean unit2status = false; //Управляемое устройство 2
boolean unit3status = false;//Управляемое устройство 3
boolean unit4status = false;//Управляемое устройство 4
 
boolean isPerimetr = false; //Контроль периметра
boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
boolean isAuto = false; //Автоматическое управление температурой
int autoTemp = 0;
int delta=2;
 
DHT dht(DHTPIN, DHTTYPE);
 
SoftwareSerial gprsSerial(2, 3);
 
boolean prevBtn = LOW;
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void setup()
{
    pinMode(unit1, OUTPUT);
    pinMode(unit2, OUTPUT);
    pinMode(unit3, OUTPUT);
    pinMode(unit4, OUTPUT);
    pinMode(powerGSM, OUTPUT);
    pinMode(perimetr, INPUT);
    pinMode(greenLed, OUTPUT);
 
    digitalWrite(unit1, LOW);
    digitalWrite(unit2, LOW);
    digitalWrite(unit3, LOW);
    digitalWrite(unit4, LOW);
    digitalWrite(powerGSM, LOW);
    digitalWrite(greenLed, LOW);
 
    //Включаю GSM Модуль
    digitalWrite(powerGSM, HIGH);
    delay(1000);
    digitalWrite(powerGSM, LOW);
    delay(5000);
    gprsSerial.begin(19200);
    delay(300);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);
 
    //Инициализация температурного датчика
    Serial.begin(9600);
    Serial.println("DHTxx test!");
 
    dht.begin();
    delay(3000);
// ParseSMS("1;20;0;1;1;1;1");
  currentTime = millis();
  loopTime = currentTime;
}
 
 
 
void GetDatchik() {
  // Пол
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    statusHome = int(h)+String(";")+int(t)+String(";")+int(unit1status)+String(";")+int(unit2status)+String(";")+int(unit3status)+String(";")+int(unit4status)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
    sendTextMessage(statusHome);
//  Serial.print("H"); //Влажность
//  Serial.print(h);
//  Serial.print(";");
//  Serial.print("T"); //Температура
//  Serial.print(t);
//  Serial.println(";");
//  Serial.println(statusHome);
 
  }
}
 
 
 
 
 
 
void loop()
{
// delay(5000);
// GetDatchik();
int sostPerimetr; //Состояние периметра
  if (gprsSerial.available()){
  char currSymb = gprsSerial.read();
// Serial.print(currSymb);
 
      //  return;
  //  char currSymb = gprsSerial.read();
  //  Serial.println(currSymb);
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("STATUS"))
            {
              GetDatchik();
            }
            else if (currStr.startsWith("0")||currStr.startsWith("1")) {
              ParseSMS(currStr);
            }
         
            isStringMessage = false;
        } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
  }
//  Контроль периметра!!!
  if (isPerimetr) { //Проверка Включен ли контроль периметра
      digitalWrite(greenLed, HIGH);
      sostPerimetr = digitalRead(perimetr);
        if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
          digitalWrite(greenLed, LOW);
          delay(200);
          digitalWrite(greenLed, HIGH);
          delay(200);
          //и отсылаем СМС
          if (sendSMS==false){
            sendTextMessage("WARNING! The perimeter of the broken!");
            sendSMS=true;
          }
      }
 
  } else {
    digitalWrite(greenLed, LOW);
  }
//  Контроль температуры!!! 
  if (isAuto==true) { //Проверка Включен автоуправление батареями
  //Замер температуры можно проводить не чаще раз в 5 минут
      currentTime = millis();
  if(currentTime >= (loopTime + 60000)){
  t = int(dht.readTemperature());
  loopTime = currentTime;
  }
//
//  Serial.print("t=");
//  Serial.println(t);
//  Serial.print("autoTemp+delta=");
//  Serial.println(autoTemp+delta);
    if (t > autoTemp+delta) {
        if ( unit1status==true){
        digitalWrite(unit1, LOW);
        unit1status=false;
        }
        if ( unit2status==true){
        digitalWrite(unit2, LOW);
        unit2status=false;
        }
        if ( unit3status==true){
        digitalWrite(unit3, LOW);
        unit3status=false;
        }
        if ( unit4status==true){
        digitalWrite(unit4, LOW);
        unit4status=false;
        }
        } else if (t < autoTemp-delta) {
        if ( unit1status==false){
        digitalWrite(unit1, HIGH);
        unit1status=true;
        }
        if ( unit2status==false){
        digitalWrite(unit2, HIGH);
        unit2status=true;
        }
        if ( unit3status==false){
        digitalWrite(unit3, HIGH);
        unit3status=true;
        }
        if ( unit4status==false){
        digitalWrite(unit4, HIGH);
        unit4status=true;
        }
        }
 
  }
}
 
 
 
 
void ParseSMS(String currStr) {
  int firstSemicolon;
  //Распарсиваем SMS
  firstSemicolon = 1;//находим первую ;
  //Получаем значение Автоматического режима контроля температуры
  // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
    if (currStr.substring(0,1) == "0"){
    isAuto=false;
  }
    else{
      isAuto=true;
    }
  //  Serial.println(currStr.substring(0,1));
//  Serial.print("isAuto=");
//  Serial.println(isAuto);
  firstSemicolon = currStr.indexOf(';');
  //Получаем значение Автоматического уровня температуры
  autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
// Serial.println(autoTemp);
  //Получаем значение Контроля периметра
  if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
    isPerimetr=false;
  } else {
      isPerimetr=true;
    }
//  Serial.println(isPerimetr);
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
  //Получаем значение Устройства 1
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit1status=false;
    digitalWrite(unit1, LOW);
//  Serial.println("Устройство 1 ВЫКЛ");
  } else{
      unit1status=true;
      digitalWrite(unit1, HIGH);
  //    Serial.println("Устройство 1 ВКЛ");
    }
firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
  //Получаем значение Устройства 2
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit2status=false;
    digitalWrite(unit2, LOW);
  } else {
      unit2status=true;
      digitalWrite(unit2, HIGH);
    }
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
  //Получаем значение Устройства 3
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit3status=false;
    digitalWrite(unit3, LOW);
  } else {
      unit3status=true;
      digitalWrite(unit3, HIGH);
    }
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
  //Получаем значение Устройства 4
if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit4status=false;
    digitalWrite(unit4, LOW);
  } else {
      unit4status=true;
      digitalWrite(unit4, HIGH);
    }
 
 
 
  }
 
/*
* Функция отправки SMS-сообщения
*/
void sendTextMessage(String text) {
    // Устанавливает текстовый режим для SMS-сообщений
    gprsSerial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
    // Устанавливаем адресата: телефонный номер в международном формате
    gprsSerial.println("AT + CMGS = \"+7909939XXXX\""); //Телефон нужно откорректировать
    delay(100);
    // Пишем текст сообщения
    gprsSerial.println(text);
    delay(100);
    // Отправляем Ctrl+Z, обозначая, что сообщение готово
    gprsSerial.println((char)26);
}
 
 
//Функция преобразовангия STRING в INT
int stringToNumber(String thisString) {
  int i, value = 0, length;
  length = thisString.length();
  for(i=0; i<length; i++) {
    value = (10*value) + thisString.charAt(i)-(int) '0';;
  }
  return value;
}
 
и ошибки к нему:
sketch_feb07b.cpp.o: In function `__static_initialization_and_destruction_0':
D:\Program Files\Arduino/sketch_feb07b.ino:30: undefined reference to `DHT::DHT(unsigned char, unsigned char, unsigned char)'
sketch_feb07b.cpp.o: In function `GetDatchik()':
D:\Program Files\Arduino/sketch_feb07b.ino:90: undefined reference to `DHT::readHumidity()'
D:\Program Files\Arduino/sketch_feb07b.ino:91: undefined reference to `DHT::readTemperature(bool)'
sketch_feb07b.cpp.o: In function `loop':
D:\Program Files\Arduino/sketch_feb07b.ino:176: undefined reference to `DHT::readTemperature(bool)'
sketch_feb07b.cpp.o: In function `setup':
D:\Program Files\Arduino/sketch_feb07b.ino:78: undefined reference to `DHT::begin()'
 
За оформление сильно не ругайте, новичок я в этом.
заранее всем благодарен

 

bwn
Offline
Зарегистрирован: 25.08.2014

Собственно для начала: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

Далее, DHT датчик на стандартных примерах из библиотеки работает?

sharp-news
Offline
Зарегистрирован: 22.01.2015

Вопрос понятен, отвечаю.

1. Этот скетч уже обкатан много раз, думается что при копировании возникли проблемы. Так как в програмировании уровень 0, отсюда и вопрос собственно.

2.  Датчики на стандартных примерах работают, опробовал 2шт.

3. Думал, что с библиотеками проблемы, опробовал три, одна из них создателя этого скетча.

Спасибо за внимание.

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

чтобы не пложить тем, отпишу тут

пытаюсь заставить выводить показания датчика на LCD экран

скетч взял в сети, вроде рабочий, но у меня идет ошибка компилирования

http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-mostrar-temperatura-con-un.html

/*
Autor: Aitor Martin
Fecha: 28-12-2013
Titulo: Sensor de temperatura DS1820
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-mostrar-temperatura-con-un.html

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.
*/

#include <OneWire.h> //Configurar bus onewhire de Dallas
#include <DallasTemperature.h>//El ternometro de Dallas DS1820
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

//Pata por la que van a entrar los datos al Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup() 
  {
  lcd.init();
  lcd.backlight(); //enciende la iluminacion
  sensors.begin(); //Iniciamos la libreria del DS1820
  }

void loop() 
{

  sensors.requestTemperatures(); //leemmos la temperatura del sensor.
  lcd.setCursor(0, 0);
  lcd.print(sensors.getTempCByIndex(0)); 
  lcd.print(" *C");
  delay(3000);
  }

Сообщение об ошибке

Arduino: 1.6.0 (Windows 8), Плата"Arduino Uno"
 
Using library OneWire in folder: C:\Program Files (x86)\Arduino\libraries\OneWire (legacy)
 
Using library DallasTemperature in folder: C:\Program Files (x86)\Arduino\libraries\DallasTemperature (legacy)
 
Using library Wire in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire 
 
Using library LiquidCrystal_v2 in folder: C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_v2 (legacy)
 
 
 
C:\Program Files (x86)\Arduino/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10600 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\OneWire -IC:\Program Files (x86)\Arduino\libraries\DallasTemperature -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire -IC:\Program Files (x86)\Arduino\libraries\LiquidCrystal_v2 C:\Users\4895~1\AppData\Local\Temp\build3158916658303816415.tmp\sketch_temp_lcd-i2c.cpp -o C:\Users\4895~1\AppData\Local\Temp\build3158916658303816415.tmp\sketch_temp_lcd-i2c.cpp.o 
 
sketch_temp_lcd-i2c.ino:6:32: error: invalid conversion from 'int' to 't_backlighPol' [-fpermissive]
In file included from sketch_temp_lcd-i2c.ino:5:0:
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_v2/LiquidCrystal_I2C.h:53:4: error:   initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)' [-fpermissive]
    LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);
    ^
sketch_temp_lcd-i2c.ino:14:28: error: 'oneWire' was not declared in this scope
In file included from sketch_temp_lcd-i2c.ino:5:0:
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_v2/LiquidCrystal_I2C.h: In function 'void setup()':
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_v2/LiquidCrystal_I2C.h:154:9: error: 'int LiquidCrystal_I2C::init()' is private
    int  init();
         ^
sketch_temp_lcd-i2c.ino:18:12: error: within this context
Ошибка компиляции.
 
не понимаю в чем дело?
почему на третью строчку не пишет в скобках (legacy) и что это значит?
"Using library Wire in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire "
sharp-news
Offline
Зарегистрирован: 22.01.2015

Мои ошибки скетча и проблемы компиляции закончились,

1. Была проблема в подгрузке библиотек датчика.

Подгрузка библиотек работает только в одном случае, импорт библиотеки/add librari/.....далее архив с библиотекой должен лежать в папке с программой arduino ide, по другому не работает, открывается архив, дальше интересно, когда качаешь библиотеки бывает многофайловая история с множеством подпапок, у вас откроется только если есть папка с файлами расширения .cpp и .h....поэтому прежде чем подгружать подготовьте архив. У вас в скетче написано требование подгрузки "include" четырех библиотек с ними со всеми может быть этот косяк. 

2. Выяснилось, что не все библиотеки одинаково хороши, в моем случае подошла одна из трех.

В вашем случае этот грех, смотри сообщение об ошибке, там ругается на диск "С" и отсутствие библиотеки в корневом каталоге.

А на каком железе вы это собираете.

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

Arduino Uno

LCD 1602 + i2c

датчик температуры ds18b20

sharp-news
Offline
Зарегистрирован: 22.01.2015

А в чем фишка этого проекта, мобильный градусник, или он ещё что-то будет делать??

Так-то есть готовые решения на этом датчике вот например....

http://www.ebay.com/itm/381026434545?_trksid=p2060778.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

bwn
Offline
Зарегистрирован: 25.08.2014

adel пишет:

Arduino Uno

LCD 1602 + i2c

датчик температуры ds18b20

Проверьте, у вас Wire.h  в папке с библиотеками находится?

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

это одна из задач которую должен решать проект

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

щас попробую поставить предыдщую версию EDE

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

ошибка выявлена, ардуин ругался на библиотеки

пришлось удалить одну библиотеку и все заработало

ковыряемся дальше

sharp-news
Offline
Зарегистрирован: 22.01.2015

 а где вы брали библиотеку к

этому датчику ds18b20, и на какой пин сажали, цифровой или аналоговый

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://arduino.ru/forum/apparatnye-voprosy/ds18b20-pokazyvaet-127#commen...

почитай. библиотека не нужна

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

на температурный датчик обычная библиотека далласа
у меня больше проблема была вывести все на экран

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

какой? 1602?

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

да

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на него вроще всего вывести. очень много инфы. ищи лучше

adel
adel аватар
Offline
Зарегистрирован: 03.02.2015

уже вывел, я через переходник бадался, оказывается просто некорректная была библиотека

остался вопрос только с созданием своих символов, как делать не понял используя i2c переходник, без него вопросов нет по сути