опять 25 (про адресное изымание данных с DS18B20)
- Войдите на сайт для отправки комментариев
Втр, 13/01/2015 - 15:44
Добрый день!
Вытащил с 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, т.е. полную чушь. Прошу ткнуть носом в ошибку. Спасибо!
с двух датчиков 85.00
Вы их в этот момент мальцем потрогайте , они очень горячие ....
Или Неправильное подключение или же "сглючили" и работают в режиме термостата.
Попробуйте проверить , если все в порядке , попробуйте отключить питание от датчика и срова включить.
с 3-го -127.00
Это либо разрыв в цепи либо неправильно прописан датчик в скрейтче, может номер неверно указан.
с двух датчиков 85.00
Вы их в этот момент мальцем потрогайте , они очень горячие ....
Или Неправильное подключение или же "сглючили" и работают в режиме термостата.
Попробуйте проверить , если все в порядке , попробуйте отключить питание от датчика и срова включить.
с 3-го -127.00
Это либо разрыв в цепи либо неправильно прописан датчик в скрейтче, может номер неверно указан.
проверял, не горячие. Ни как не риагируют на нагрев. Про 3-й скорее всго да, контакт плохой.
Куда цикл ставить?
Попробуй вот так: 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); }85 - это начальное значение, при инициализации датчика. Вы опрашиваете датчики подряд, попробуйте вставить паузы между запросами. Ну и опросить не мешает сперва перед чтением - requestTemperatures
-127 - это константа DEVICE_DISCONNECTED, т.е. не подключен датчик (или плохой контакт или в адресе ошибка)
Вместо
sensors.getTempCпопробуйтеsensors.requestTemperaturesByAddressПопробуй вот так: 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); }Блин! Точно! Полтора года эти датчики не трогал и подзабыл уже...
Спасибо! Все заработало.
#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"); }Еще вариант не прямо обращяться по адресу к датчику , а при запуске определять количество и адреса датчиков.
все что личнее закомментил и оно не выводится на экран и не пишится в порт.
Вопрос еще один, не совсем по теме, как float перегнать в String, не char а именно String.
попробуй тут почитать
http://arduino.ru/forum/programmirovanie/preobrazovanie-iz-float-v-string
попробуй тут почитать
http://arduino.ru/forum/programmirovanie/preobrazovanie-iz-float-v-string
Видел эту тему, там только float в char.
Нашел сайт с описанием конвертации различных типов данных, модераторы может скопипастите в учебник?
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/
Что бы не засарять форум своими бесконечными темами-вопросами буду писать здесь.
Как в отправляемом SMS сообщении через SIM900 в тексте сообщения сделать перенос строки? Сечас строка данных выглядит так:
С использованием кодов ◙ ♪ (#10 #13) SMS сообщение попросту не отправляется.
Господа! Где ошибка? Сообщения приходят через раз... Как повысить надежность и получить 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 (""); }Я не вижу int в объявлении в бибилиотеке, но вижу int у тебя.
Я не вижу int в объявлении в бибилиотеке, но вижу int у тебя.
Не влияет на работу SIM900
Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.
Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.
Поддерживаю, да еще и 2К памяти сэкономите.
А можно вообще на ассемблере писать. ;)
Народ, ну зачем вам "DallasTemperature.h"? Одной "OnWire.h" более чем достаточно. У нее есть хороший пример работы с DS18B20.
Поддерживаю, да еще и 2К памяти сэкономите.
Исправлю ,если не будет хватать памяти.
На вопрос по стабильность отправки СМС не раскрыт.
Исправлю ,если не будет хватать памяти. На вопрос по стабильность отправки СМС не раскрыт.
1) поднять питание. шилду во время активной работы нужно до 2 ампер.
2) поиграться с delay(), возможно нужно увеличить значения, а может наоборот.
Исправлю ,если не будет хватать памяти. На вопрос по стабильность отправки СМС не раскрыт.
1) поднять питание. шилду во время активной работы нужно до 2 ампер.
2) поиграться с delay(), возможно нужно увеличить значения, а может наоборот.
Спасибо. Питание действительно сейчас не очень (9v 600mA). Могу я на шилд подать 12v (3А)?
https://cloud.mail.ru/public/002583debfa1/IMG_20150115_125527.jpg
Вроде как mic 29302wu 1404 Uвх-26в.
хз, нужно даташит курить. судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.
Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.
хз, нужно даташит курить. судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.
Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.
нету промышленных блоков питания на дин рейку 9v 2а....
хз, нужно даташит курить. судя по тому, что пишут продавцы на ебее по этому шилду, рекомендуется именно 9v питание, просто шилду нужна бОльшая сила тока.
Because SIM900 peak current more than 2A. This shield must work with a external DC9V power supply.
нету промышленных блоков питания на дин рейку 9v 2а....
Так возьмите подходящий по параметрам и размерам, и в корпус его под DIN рейку. Или глянуть 12В, наверняка можно снизить до 9В.
Я сам МК и отдельно шилд думал с одного БП параллельно запитать.
А чем это противоречит 9в блоку питания?
Дак 12в уже куплен.
Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.
Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.
Видимо так и придется, а так не хотелось. Блок питания взял вот ЭТОТ. Диапазон регулирования с 11,4в начинается, придется допиливать.
Вскройте и посмотрите что там. Либо реально регулировать, либо доп.понижайку прилепить.
Видимо так и придется, а так не хотелось. Блок питания взял вот ЭТОТ. Диапазон регулирования с 11,4в начинается, придется допиливать.
Посмотрите цепь регулировки, я подозреваю, что там подстроечник в цепи делителя.
Еще вопрос назрел. Где то мне попадался кусок скетча с описанием програмного старта модуля, сейчас не могу найти. Может кто подкинет?
Еще вопрос назрел. Где то мне попадался кусок скетча с описанием програмного старта модуля, сейчас не могу найти. Может кто подкинет?
Модуля которого?
Да
Up!
Добрый вечер.
И снова я.
Стал меня не устраивать принцип работы (примеры из статей) чтения SMS сообщений, а именно вот этот код:
void readSMS () { if (isStringMessage) { if (!currStr.compareTo("Report")) { . . . } isStringMessage = false; nomer1 = ""; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением Serial.println (currStr); isStringMessage = true; } } }Данная конструкция не позволяет записывать текст смс сообщения и работать с ним.
Прошу дать пример чтения и записи теста тела сообщения в переменную String.
Спаибо!
Подумал. Возможно проблема в кодировке 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();Прошу коментариев.
Люди добрые, не проходите мимо...
Оу, выходные провел на природе, силы притекли, сознание прояснилось - сам разобрался.