опять 25 (про адресное изымание данных с DS18B20)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый день!

Вытащил с 3-х датчиков DS18B20 их порядковые номера.

Написал следующий скетч

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// 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);

// arrays to hold device addresses
DeviceAddress insideThermometer = {0x28, 0x07, 0x1D, 0x2B, 0x06, 0x00, 0x00, 0x3E};
DeviceAddress outsideThermometer = {0x28, 0xF0, 0xEA, 0x2B, 0x06, 0x00, 0x00, 0x3E};
DeviceAddress airThermometer = {0x28, 0x0F, 0xC2, 0x2A, 0x06, 0x00, 0x00, 0x21};
void setup ()
{
  Serial.begin(9600);
  sensors.begin();
}

void loop ()
{
  float inT = sensors.getTempC(insideThermometer);
  float outT = sensors.getTempC(outsideThermometer);
  float airT = sensors.getTempC(airThermometer);
  Serial.println (inT);
  Serial.println (outT);
  Serial.println (airT);
  delay(1000);
}

В сериал выдает с двух датчиков 85.00, с 3-го -127.00, т.е. полную чушь. Прошу ткнуть носом в ошибку. Спасибо!

vitalikost
Offline
Зарегистрирован: 28.11.2014
sensors.requestTemperatures() забыл в цыкле
BuGz
Offline
Зарегистрирован: 13.01.2015

ingener.solovyev пишет:

 с двух датчиков 85.00

Вы их в этот момент мальцем потрогайте , они очень горячие ....

Или Неправильное подключение или же "сглючили" и работают в режиме термостата.

Попробуйте проверить , если все в порядке , попробуйте отключить питание от датчика и срова включить. 

ingener.solovyev пишет:

с 3-го -127.00

Это либо разрыв в цепи либо неправильно прописан датчик в скрейтче, может номер неверно указан.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

BuGz пишет:

ingener.solovyev пишет:

 с двух датчиков 85.00

Вы их в этот момент мальцем потрогайте , они очень горячие ....

Или Неправильное подключение или же "сглючили" и работают в режиме термостата.

Попробуйте проверить , если все в порядке , попробуйте отключить питание от датчика и срова включить. 

ingener.solovyev пишет:

с 3-го -127.00

Это либо разрыв в цепи либо неправильно прописан датчик в скрейтче, может номер неверно указан.

проверял, не горячие. Ни как не риагируют на нагрев. Про 3-й скорее всго да, контакт плохой.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

vitalikost пишет:

sensors.requestTemperatures() забыл в цыкле

 

Куда цикл ставить?

vitalikost
Offline
Зарегистрирован: 28.11.2014
Попробуй вот так:

void loop ()
{
 sensors.requestTemperatures(); 
 float inT = sensors.getTempC(insideThermometer);
  float outT = sensors.getTempC(outsideThermometer);
  float airT = sensors.getTempC(airThermometer);
  Serial.println (inT);
  Serial.println (outT);
  Serial.println (airT);
  delay(1000);
}

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

85 - это начальное значение, при инициализации датчика. Вы опрашиваете датчики подряд, попробуйте вставить паузы между запросами. Ну и опросить не мешает сперва перед чтением - requestTemperatures

-127 - это константа DEVICE_DISCONNECTED, т.е. не подключен датчик (или плохой контакт или в адресе ошибка)

Вместо sensors.getTempC попробуйте sensors.requestTemperaturesByAddress

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

vitalikost пишет:

Попробуй вот так:

void loop ()
{
 sensors.requestTemperatures(); 
 float inT = sensors.getTempC(insideThermometer);
  float outT = sensors.getTempC(outsideThermometer);
  float airT = sensors.getTempC(airThermometer);
  Serial.println (inT);
  Serial.println (outT);
  Serial.println (airT);
  delay(1000);
}

 

 

Блин! Точно! Полтора года эти датчики не трогал и подзабыл уже...

 

Спасибо! Все заработало.

BuGz
Offline
Зарегистрирован: 13.01.2015
#include <OneWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(4, 5, 10, 11, 12, 13); // подключаем дисплей , используем контакты указанные в скобках
OneWire  ds(2);  // on pin 2 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
  lcd.begin(16, 2);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
//    Serial.println("No more addresses.");
//    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
///  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
//    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
//  Serial.println();
// 
//  // the first ROM byte indicates which chip
//  switch (addr[0]) {
//    case 0x10:
//      Serial.println("  Chip = DS18S20");  // or old DS1820
//      type_s = 1;
//      break;
//    case 0x28:
//      Serial.println("  Chip = DS18B20");
//      type_s = 0;
//      break;
//    case 0x22:
//      Serial.println("  Chip = DS1822");
//      type_s = 0;
//      break;
//    default:
//      Serial.println("Device is not a DS18x20 family device.");
//      return;
//  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

///  Serial.print("  Data = ");
//  Serial.print(present, HEX);
//  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
//    Serial.print(data[i], HEX);
//    Serial.print(" ");
  }
///  Serial.print(" CRC=");
//  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  lcd.setCursor(0, 1);
  lcd.print("  t = ");
  Serial.print(celsius);
  lcd.print(celsius);
  Serial.print(" c. ");
  lcd.print(" c. ");
 ///  Serial.print(fahrenheit);
///  Serial.println(" Fahrenheit");
}

Еще вариант не прямо обращяться по адресу к датчику , а при запуске определять количество и адреса датчиков.

все что личнее закомментил и оно не выводится на экран и не пишится в порт.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Вопрос еще один, не совсем по теме, как float перегнать в String, не char а именно String.

BuGz
Offline
Зарегистрирован: 13.01.2015

ingener.solovyev пишет:
Вопрос еще один, не совсем по теме, как float перегнать в String, не char а именно String.

попробуй тут почитать

http://arduino.ru/forum/programmirovanie/preobrazovanie-iz-float-v-string

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

BuGz пишет:

ingener.solovyev пишет:
Вопрос еще один, не совсем по теме, как float перегнать в String, не char а именно String.

попробуй тут почитать

http://arduino.ru/forum/programmirovanie/preobrazovanie-iz-float-v-string


Видел эту тему, там только float в char.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Нашел сайт с описанием конвертации различных типов данных, модераторы может скопипастите в учебник?

http://bigbarrel.ru/%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B0%D1%...

http://bigbarrel.ru/float-to-byte/

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Что бы не засарять форум своими бесконечными темами-вопросами буду писать здесь.

Как в отправляемом SMS сообщении через SIM900 в тексте сообщения сделать перенос строки? Сечас строка данных выглядит так:


Dallas = "Tin="+Tin+"C Tout="+Tout+"C Tair="+Tair+"C";

С использованием кодов ◙ ♪ (#10 #13) SMS сообщение попросту не отправляется.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Господа! Где ошибка? Сообщения приходят через раз... Как повысить надежность и получить 100% отдачу?

 

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 10
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer = {0x28, 0x07, 0x1D, 0x2B, 0x06, 0x00, 0x00, 0x3E};
DeviceAddress outsideThermometer = {0x28, 0xF0, 0xEA, 0x2B, 0x06, 0x00, 0x00, 0x3E};
DeviceAddress airThermometer = {0x28, 0x0F, 0xC2, 0x2A, 0x06, 0x00, 0x00, 0x21};

     // Технологические переменные
byte Motor=0; //Двигатель установки 0-выключен, 1-включен 
int TAL=20; // Нижняя температурная аврийная граница обратной сетевой воды
int TAH=14; // Нижняя температурная аварийная граница воздуха в канале
byte Alarm; //Сигнализация


     // Промежуточные переменные
byte Error; // Ошибка ввода строки
String currStr = ""; //в строке curStr будем хранить текущую строку, которую передает модем или терминал
boolean isStringMessage = false;
String nomer1; //Номер телефона с которого звонят
String nomer2; //Номер телефона с которого отправлено SMS
String password;
String Dallas; //данные с DS18B20
String Date; // Текущая дата, время


void setup()
{
  Serial.begin(9600);
  powerUp();
  sensors.begin();
  gprsSerial.begin(19200);
  if (gprsSerial.println("AT+CNMI=2,2,0,0,0"))
  {Serial.println ("Ok");}
  delay(500);
  if (gprsSerial.println("ATE0"))
  {Serial.println ("Ok");}
  delay (500);
  if (gprsSerial.println("AT+CLIP=1"))
  {Serial.println ("Ok");}
  delay (500);
  gprsSerial.print("AT+CMGF=1\r");
  delay(500);
  gprsSerial.flush();
  Serial.println ("GSM begin");
  startSMS ();
}

void loop()
{
  if (gprsSerial.available()){gsm();}
}

//Снятие показаний с датчиков температуры
void DS18B20 ()
{
  sensors.requestTemperatures();
  int inT = sensors.getTempC(insideThermometer);
  delay (50);
  String Tin =  String(inT, DEC);
  int outT = sensors.getTempC(outsideThermometer);
  delay (50);
  String Tout =  String(outT, DEC);
  int airT = sensors.getTempC(airThermometer);
  delay (50);
  String Tair =  String(airT, DEC);
  Dallas = "Tin="+Tin+"C Tout="+Tout+"C Tair="+Tair+"C";
  Serial.println (Dallas);
}

//Работа с GSM модулем
void gsm ()
{
  char currSymb = gprsSerial.read();    
  if ('\r' == currSymb){
//   readSMS ();
   readCall ();
   currStr = "";
  } else if (currSymb != '\n'){currStr += String(currSymb);}
}

//чтение звонка
void readCall ()
{
 if (currStr.startsWith("+CLIP:")) {
    delay(3000);
    nomer1=currStr.substring(8,20);
    gprsSerial.println("ATH0");
    //текущая строка начинается с "+CLIP", значит звонят
    Serial.println ("Number: "+nomer1);
    currStr = "";
    DS18B20 ();
    sendSMS ();
 }
}
//чтение SMS
/*void readSMS ()
{
}*/
//Передача SMS сообщения
void sendSMS ()
{
  String numberSMS = ("AT + CMGS = \"" + nomer1 + "\"");
  gprsSerial.println(numberSMS);
  delay(100);
  gprsSerial.println(Dallas);
  delay(100);
  gprsSerial.println((char)26); // Отправляем Ctrl+Z, конец сообщения
}

//SMS сообщение о запуске/перезагрузке модуля
void startSMS ()
{
  gprsSerial.println("AT + CMGS = \"+79655176377\"");
  delay(100);
  gprsSerial.println("Arduino GSM Shield Start");
  delay(100);
  gprsSerial.println((char)26); // Отправляем Ctrl+Z, конец сообщения
}

//включение питания шилда
void powerUp()
{
 Serial.print ("Power UP - ");
 pinMode(9, OUTPUT); 
  digitalWrite(9,HIGH);
 delay(1000);
 digitalWrite(9,LOW);
 delay(5000);
 Serial.print ("Ok");
 Serial.println ("");
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014
  // returns temperature in degrees C
  float getTempC(const uint8_t*);

Я не вижу int в объявлении в бибилиотеке, но вижу int у тебя.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Radjah пишет:

  // returns temperature in degrees C
  float getTempC(const uint8_t*);

Я не вижу int в объявлении в бибилиотеке, но вижу int у тебя.


Не влияет на работу SIM900

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.

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

KVadik пишет:

Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.

Поддерживаю, да еще и 2К памяти сэкономите.

Radjah
Offline
Зарегистрирован: 06.08.2014

А можно вообще на ассемблере писать. ;)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

bwn пишет:

KVadik пишет:

Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.

Поддерживаю, да еще и 2К памяти сэкономите.


Исправлю ,если не будет хватать памяти.

На вопрос по стабильность отправки СМС не раскрыт.

Maverik
Offline
Зарегистрирован: 12.09.2012

ingener.solovyev пишет:

Исправлю ,если не будет хватать памяти. На вопрос по стабильность отправки СМС не раскрыт.

1) поднять питание. шилду во время активной работы нужно до 2 ампер.

2) поиграться с delay(), возможно нужно увеличить значения, а может наоборот.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Maverik пишет:

ingener.solovyev пишет:

Исправлю ,если не будет хватать памяти. На вопрос по стабильность отправки СМС не раскрыт.

1) поднять питание. шилду во время активной работы нужно до 2 ампер.

2) поиграться с delay(), возможно нужно увеличить значения, а может наоборот.

 

Спасибо. Питание действительно сейчас не очень (9v 600mA). Могу я на шилд подать 12v (3А)?

https://cloud.mail.ru/public/002583debfa1/IMG_20150115_125527.jpg

Вроде как mic 29302wu 1404 Uвх-26в.

Maverik
Offline
Зарегистрирован: 12.09.2012

хз, нужно даташит курить.  судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.

Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Maverik пишет:

хз, нужно даташит курить.  судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.

Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.

 

нету промышленных блоков питания на дин рейку 9v 2а....

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

ingener.solovyev пишет:

Maverik пишет:

хз, нужно даташит курить.  судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.

Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.

 

нету промышленных блоков питания на дин рейку 9v 2а....

Так возьмите подходящий по параметрам и размерам, и в корпус его под DIN рейку. Или глянуть 12В, наверняка можно снизить до 9В.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Я сам МК и отдельно шилд думал с одного БП параллельно запитать.

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

ingener.solovyev пишет:
Я сам МК и отдельно шилд думал с одного БП параллельно запитать.

А чем это противоречит 9в блоку питания?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Дак 12в уже куплен.

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

ingener.solovyev пишет:
Дак 12в уже куплен.

Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

bwn пишет:

ingener.solovyev пишет:
Дак 12в уже куплен.

Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.

Видимо так и придется, а так не хотелось. Блок питания взял вот ЭТОТ. Диапазон регулирования с 11,4в начинается, придется допиливать.

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

ingener.solovyev пишет:

bwn пишет:

ingener.solovyev пишет:
Дак 12в уже куплен.

Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.

Видимо так и придется, а так не хотелось. Блок питания взял вот ЭТОТ. Диапазон регулирования с 11,4в начинается, придется допиливать.

Посмотрите цепь регулировки, я подозреваю, что там подстроечник в цепи делителя.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Еще вопрос назрел. Где то мне попадался кусок скетча с описанием програмного старта модуля, сейчас не могу найти. Может кто подкинет?

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

ingener.solovyev пишет:

Еще вопрос назрел. Где то мне попадался кусок скетча с описанием програмного старта модуля, сейчас не могу найти. Может кто подкинет?

Модуля которого?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Да

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Up!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый вечер.

И снова я.

Стал меня не устраивать принцип работы (примеры из статей) чтения SMS сообщений, а именно вот этот код:

void readSMS ()
{
 if (isStringMessage) {
   if (!currStr.compareTo("Report")) {
    .
    .
    .
   }
    isStringMessage = false;
    nomer1 = "";
 } else {
     if (currStr.startsWith("+CMT")) {
        //если текущая строка начинается с "+CMT",
        //то следующая строка является сообщением
        Serial.println (currStr);
        isStringMessage = true;
     }
 }
}

Данная конструкция не позволяет записывать текст смс сообщения и работать с ним. 

Прошу дать пример чтения и записи теста тела сообщения в переменную String.

Спаибо!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Подумал. Возможно проблема в кодировке SMS? Просто заметил, что когда приходит SMS, в Serial выводится отчет, и в том месте где должен был быть текст, у меня 1 пустой символ, а потом ОК.

Какой должна быть кодировка и как правильно задать код AT+CNMI ?

У меня сейчас подготовка к работе SIM900 выглядит так:

gprsSerial.begin(19200);
  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(300);
  gprsSerial.println("AT+CLIP=1");
  delay (300);
  gprsSerial.flush();

 

Прошу коментариев.

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Люди добрые, не проходите мимо...

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Оу, выходные провел на природе, силы притекли, сознание прояснилось - сам разобрался.