Ds18b20 ошибка 127 градусов

Модератор: immortal

Модератор: immortal

Аватара пользователя

CheBuraw

Сообщения: 28
Зарегистрирован: Ср авг 23, 2017 6:29 pm
Благодарил (а):
7 раз
Поблагодарили:
13 раз

18B20 периодические показания -127.00. Чистка базы.

Предыстория.
Столкнулся с такой проблемой при построении графиков. Периодически 2 датчика 18B20 выдают показания -127.00 градусов. Из-за этого, как Вы понимаете, график приобретает не совсем приятный и наглядный вид. Изучение вопроса показало что с такими показаниями я сталкиваюсь не один и на форуме arduino много на эту тему обсуждения имеется. Купировать ошибку (как оказалось такие показания датчик выдает в случае ошибки) на устройстве мне не удалось, поэтому решил чистить её в базе. Понимаю что это реально костыль, но в данной ситуации лично мне так удобнее. Если и Вас достали провалы в показаниях на графиках, то вот моё решение. Делать так Вам или нет решайте сами.
Моё решение.
1) Заходим в phpMyAdmin
http://<DNS_имя_или_IP_сервера_MajorDoMo>/phpmyadmin/
Логин (по умолчанию, если не меняли): root
пароль (по умолчанию, если не меняли): rootpsw
2) В левой части экрана выбираем базу db_terminal
3) Создаем новое Событие

php02.PNG
php02.PNG (14.78 КБ) 6174 просмотра

4) Заполняем параметры события:
Название события: Любое, как Вам угодно
Состояние: ENABLE (включено)
Тип события: RECURRING (повторяющееся)
Выполнять каждые: 1(один) HOUR (час) // Это периодичность выполнения данного события. Настройте как Вам удобно.
Начало: //я указал текущий день и ближайшее округлённое время. Может его и вообще можно было пустым оставить :)
Определение: DELETE FROM `db_terminal`.`phistory` WHERE value=’-127.00′
// Это как раз запрос который в данной базе в ветке истории найдет все записи со значением -127.00 и удалит их
Сохранить при окончании: (не менял)
Определитель: (не заполнял)
Комментарий: (не обязателен)
Сохраняемся. (в моем случае идем Вперёд)

php03.PNG
php03.PNG (39.66 КБ) 6174 просмотра

5) Проверяем Статус планировщика событий. Должен быть Включен — зелёного цвета.

php04.PNG
php04.PNG (17.27 КБ) 6174 просмотра

6) Выходим из phpMyAdmin

Только что мы создали в планировщике БД событие, которое будет с заданной периодичностью удалять из базы истории записи со значением «-127.00»
Суточное тестирование проблем не выявило. Скрипт отрабатывает четко и графики вновь стали наглядными.

За это сообщение автора CheBuraw поблагодарили (всего 2):
Chainik (Вт фев 13, 2018 12:27 pm) • Amarok (Вт фев 13, 2018 1:08 pm)

fandaymon

Сообщения: 1510
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а):
39 раз
Поблагодарили:
555 раз

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

fandaymon » Вт фев 13, 2018 12:31 pm

По-моему гораздо проще не добавлять такие значения в базу. Перед добавлением делать проверку на -127 и всё…

Chainik

Сообщения: 1458
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а):
255 раз
Поблагодарили:
454 раза

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

Chainik » Вт фев 13, 2018 12:32 pm

CheBuraw, спасибо, что делитесь наработками и подробными инструкциями.
Правда, у меня возникает естественный вопрос. Если мы используем Мажордомо, почему нельзя перед записью значения в БД верифицировать его на корректность/допустимость, и явно ошибочные «отбраковывать» (или заменять предыдущими)? Зачем избран такой «сложный» путь «отбраковки» неправильных значений уже после записи в БД (и непосредственно из СУБД)?

Аватара пользователя

Amarok

Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а):
459 раз
Поблагодарили:
126 раз
Контактная информация:

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

Amarok » Вт фев 13, 2018 1:22 pm

Можно использовать такой алгоритм:

  • привязать датчик к свойству input
  • создать метод inputChanged с таким текстом:

    Код: Выделить всё

    $value = $this->getProperty('input');
    if ($value != $this->getProperty('value'); {
     if ($value <= '-127') {return;}
     $this->setProperty('value',$value);
    }
    
  • связываем свойство input с методом inputChanged
  • и уже на свойство value прикручиваем историю.

Таким способом мы отбросим повторяющиеся или неверные значения.

За это сообщение автора Amarok поблагодарил:
CheBuraw (Вт фев 13, 2018 4:43 pm)

Аватара пользователя

CheBuraw

Сообщения: 28
Зарегистрирован: Ср авг 23, 2017 6:29 pm
Благодарил (а):
7 раз
Поблагодарили:
13 раз

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

CheBuraw » Вт фев 13, 2018 4:25 pm

Честно говоря, для меня проще оказалось настроить систематическую чистку БД, чем отсеивать данные значения на лету, при получении.
Ваши предложения считаю достаточно интересными. Я о таком варианте даже как-то и не подумал :).
Amarok, спасибо за конкретный пример ещё одного варианта решения проблемы.

Аватара пользователя

Amarok

Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а):
459 раз
Поблагодарили:
126 раз
Контактная информация:

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

Amarok » Вт фев 13, 2018 8:07 pm

Код: Выделить всё

if ($value != $this->getProperty('value'); {
 if ($value <= '-127') {return;}
 $this->setProperty('value',$value);
} 

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

Fav0rit

Сообщения: 60
Зарегистрирован: Чт мар 19, 2015 10:27 pm
Благодарил (а):
8 раз
Поблагодарили:
22 раза

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

Fav0rit » Чт фев 15, 2018 8:34 pm

CheBuraw писал(а):Честно говоря, для меня проще оказалось настроить систематическую чистку БД, чем отсеивать данные значения на лету, при получении.
Ваши предложения считаю достаточно интересными. Я о таком варианте даже как-то и не подумал :).
Amarok, спасибо за конкретный пример ещё одного варианта решения проблемы.

Здесь на форуме я выкладывал свой новый класс sensors где все это уже реализовано, очень рекомендую. Могу выложить новую версию, с тех пор я исправить некоторые ошибки и внёс доработки

Отправлено с моего Redmi 3 через Tapatalk
//cloud.tapatalk.com/s/5a85c523f4182/Sensors.txt

За это сообщение автора Fav0rit поблагодарил:
CheBuraw (Вт фев 27, 2018 8:48 am)

CAHbKA

Сообщения: 37
Зарегистрирован: Сб мар 17, 2018 6:37 am
Благодарил (а):
10 раз
Поблагодарили:
2 раза

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

CAHbKA » Ср мар 21, 2018 3:34 pm

Amarok писал(а):Можно использовать такой алгоритм:

привязать датчик к свойству input

А если это не датчик, погода с тырнета, но видимо само это свойство надо искать где то в папках через консоль (ну или через ssh цепляться и рыться в папках). через веб оболочку это не сделаешь. Правильно?

Pi3 + MJD

Аватара пользователя

Amarok

Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а):
459 раз
Поблагодарили:
126 раз
Контактная информация:

Re: 18B20 периодические показания -127.00. Чистка базы.

Сообщение

Amarok » Чт мар 22, 2018 7:37 am

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

  • #1

Доброго всем дня. Помогите с советом. Подключаю датчик DS18B20 к ESP8622 NODE MCU. Выдаёт -127, как будто датчик не подключен. Резистор 4,7К между сигнальным и питающим проводом есть. Библиотеки OneWire и DalasTemperature взял адаптированные под ESP8622. Для проверки пинов подключил LCD2004 — всё работает. Взял другой датчик — аналогичная картина.

Сергей_Ф


  • #2

@Colibrilab на чем пишете? И где код? Какой пин задействуете? Какое напряжение питания датчика?

  • #3

@Colibrilab на чем пишете? И где код? Какой пин задействуете? Какое напряжение питания датчика?

Пишу в Arduino IDE. Код из примеров «DallasTemperature/Simple» без изменений. Пины пробовал разные. Например, D1 (GPIO5).

  • #4

@Colibrilab на чем пишете? И где код? Какой пин задействуете? Какое напряжение питания датчика?

Датчик пробовал запитывать как от пина 3.3, так и от пина VIN.

Сергей_Ф


  • #5

@Colibrilab думаю с пинами ошиблись. Попробуйте подключить к d4 == gpio2 и в коде OneWire ds (2);
Питание датчика +5в. Должно работать.

  • #6

@Colibrilab думаю с пинами ошиблись. Попробуйте подключить к d4 == gpio2 и в коде OneWire ds (2);
Питание датчика +5в. Должно работать.

Сенсор работает в диапазоне напряжений от 3.0 В до 5.5 В. Поэтому питание здесь не при делах. Один сенсор потребляет не много тока, чтобы просадить контроллер. Но я попробовал и с внешним питанием — аналогичная ситуация. Интересно то, что на GPIO2 всё работает. Но на других портах нет. При этом, пины живые — на них работает LDC2004. Как так?

Сергей_Ф


  • #8

Вы имеете в виду их нумерацию? Но тогда бы не работал LCD2004. К тому же я еще проверял их работоспособность командой digitalWrite. Проблема именно с датчиком DS18B20. Полагаю, что проблема может быть только в библиотеке OneWire. Хотя я её скачал как раз под ESP8622. Не могли бы Вы поделится своей ссылкой на данную библиотеку?

tretyakov_sa


  • #9

Сенсор работает в диапазоне напряжений от 3.0 В до 5.5 В. Поэтому питание здесь не при делах. Один сенсор потребляет не много тока, чтобы просадить контроллер. Но я попробовал и с внешним питанием — аналогичная ситуация. Интересно то, что на GPIO2 всё работает. Но на других портах нет. При этом, пины живые — на них работает LDC2004. Как так?

На GPIO2 уже есть резистор он подтягивает вход к питанию, значит датчик должен работать с прямым подключением без резистора. Будет работать и на GPIO0, к другим пинам обязательно подключать резистор, если не работает проверяйте правильность номинала резистора. Не будет работать на GPIO15 и GPIO16.

  • #10

На GPIO2 уже есть резистор он подтягивает вход к питанию, значит датчик должен работать с прямым подключением без резистора. Будет работать и на GPIO0, к другим пинам обязательно подключать резистор, если не работает проверяйте правильность номинала резистора. Не будет работать на GPIO15 и GPIO16.

Сам в шоке :) Конечно, уже проверил резистор — 4,8К. Попробовал 3К и 6К — аналогично. На GPIO2 всё работает, на остальных нет. И пины рабочие — прочая периферия на них работает.

Сергей_Ф


  • #11

проблема может быть только в библиотеке OneWire. Хотя я её скачал как раз под ESP8622. Не могли бы Вы поделится своей ссылкой на данную библиотеку?

я пользовался стандартной, но только на пине 2. Остальные не проверял. Если удастся проверить сегодня, отпишусь.

Сергей_Ф


  • #12

@nikolz если бы @Colibrilab знал бы Луа, Ваш совет был бы не нужным, а так бессмысленен, поскольку сначала надо Луа изучить. Не так ли?

  • #13

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

Если бы у бабушки был бы … Спасибо за совет. Но у меня есть рабочий скетч для контроллера, который чудесно работает на Arduino в таком девайсе: Контроллер ректификационной колонны — окончательный вариант . Не собираюсь его переписывать, а собираюсь переделать саму плату под nodemcu. Как-нибудь займусь прочими способами программирования контроллера, но пока меня интересует вопрос почему DS18B20 не работает на других пинах, кроме GPIO2? Вы знаете ответ? Если не знаете, то прочие советы не интересуют.

tretyakov_sa


  • #14

Сам в шоке :) Конечно, уже проверил резистор — 4,8К. Попробовал 3К и 6К — аналогично. На GPIO2 всё работает, на остальных нет. И пины рабочие — прочая периферия на них работает.

Только что проверил на 12 ноге все работает. Питание 3.3В резистор 10K.

Сергей_Ф


  • #15

@Colibrilab проверил на Witty Cloud ESP-12E на пине 5 и 4 стандартный пример из стандартной библиотеки OneWire (не адаптированной под ESP, а той что ставится из менеджера библиотек) работает без проблем. Питание датчика +5В, резистор 4,7 кОм.
На 15-том работать не может, поскольку при старте он должен быть притянут к нулю.

Последнее редактирование: 2 Окт 2016

  • #16

Полагаю, что это не окончательный вариант.
В контроллере блоки 4, 8 и 9 выкидывайте и ставьте nodemcu.
——————————
Я для подобной задачи сделал спектрометр на диапазон от 0.2 до 0.8 мкм.
————————————
Контроль качества спирта в соответствии с ГОСТОМ делается в диапазоне 0.2-0.4 мкм.

Этим и занимаюсь :) Я бы не заморачивался, но при использовании Arduino упёрся в нехватку оперативной памяти и памяти под скетч. В связи с этим пришлось отказаться от реализации некоторых фишек. Поэтому взял nodecmu. А что за спектрометр у вас?

  • #17

Только что проверил на 12 ноге все работает. Питание 3.3В резистор 10K.

Спасибо. Какой-то полтергейст :) Самое смешное, что у меня два модуля nodecmu. И оба себя ведут так же. Попробую найти другую библиотеку OneWire — других причин сие гемороя не вижу.

  • #18

@Colibrilab проверил на Witty Cloud ESP-12E на пине 5 и 4 стандартный пример из стандартной библиотеки OneWire (не адаптированной под ESP, а той что ставится из менеджера библиотек) работает без проблем. Питание датчика +5В, резистор 4,7 кОм.
На 15-том работать не может, поскольку при старте он должен быть притянут к нулю.

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

Сергей_Ф


  • #19

@Colibrilab а не проще в скетче пин поменять, если на 2ом всё работает? Там же все равно вся разводка другая будет.

  • #20

@Colibrilab а не проще в скетче пин поменять, если на 2ом всё работает? Там же все равно вся разводка другая будет.

Уже так сделал. Всё работает. Но гложет неразгаданное :)

19.04.2019, 01:49. Показов 5700. Ответов 40


Не пойму почему не работает программный 1-Wire на 328 меге. Может я там где-то что-то с портами напутал? Диод мигает с частотой в 0.5 Гц, как положено. Дисплей по i2c пашет, часы тоже. А вот далласы не хотят работать, подозреваю, что совсем.

Текст библиотечного/хэдерного файла 1-WIRE:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#define DEVICES_ERROR  1
 
#define CMD_CONVERTTEMP    0x44
#define CMD_RSCRATCHPAD    0xbe
#define CMD_WSCRATCHPAD    0x4e
#define CMD_CPYSCRATCHPAD  0x48
#define CMD_RECEEPROM      0xb8
#define CMD_RPWRSUPPLY     0xb4
#define CMD_SEARCHROM      0xf0
#define CMD_READROM        0x33
#define CMD_MATCHROM       0x55
#define CMD_SKIPROM        0xcc
#define CMD_ALARMSEARCH    0xec
#define uint64_t long long
#define uint8_t char
#define uint16_t int
#define uint32_t long
uint8_t ONE_WIRE_DQ = PINB1;
 
void oneWireInit(uint8_t pin) {
  ONE_WIRE_DQ = pin; 
  //ONE_WIRE_PORT |= (1 << ONE_WIRE_DQ);     ИЗНАЧАЛЬНО ТУТ ЭТО БЫЛО, ВРОДЕ КАК НЕ НУЖНО?
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
}
 
/*
 * сброс
 */
uint8_t reset() {
  uint8_t response;
 
  // импульс сброса, минимум 480us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(480);
 
  // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(70);
 
  // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us.
  response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ));
  _delay_us(410);
 
  // если 0, значит есть ответ от датчика, если 1 - нет
  return response;
}
 
/*
 * отправить один бит
 */
void writeBit(uint8_t bit) {
  if (bit & 1) {
    //cli();
    // логический «0» на 1us
    ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
    ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
    _delay_us(8);
    //sei();
    ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
    _delay_us(62);
  } else {
    //cli();
    // логический «0» на 1us
    ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
    ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);
    _delay_us(62);
    ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
    //sei();
    _delay_us(8);
  }
}
 
/*
 * отправить один байт
 */
void writeByte(uint8_t byte) {
  uint8_t i = 8;
  while (i--) {
    writeBit(byte & 1);
    byte >>= 1;
  }
}
 
 
 
/*
 * получить один бит
 */
char readBit (void) {
  uint8_t bit = 0;
  //cli();
  // логический «0» на 1us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(6);
 
  // освободить линию и ждать 14us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(10);
 
  // прочитать значение
  if (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ)) {
    bit = 1;
  }
 
  // ждать 45us и вернуть значение
  //sei();
  _delay_us(55);
  return bit;
}
 
 
/*
 * получить один байт
 */
uint8_t readByte() {
  uint8_t i = 8, byte = 0;
  while (i--) {
    byte >>= 1;
    byte |= (readBit() << 7);
  }
  return byte;
}
 
/*
 * читать ROM подчиненного устройства (код 64 бита)
 */
uint64_t readRoom(void) {
  uint64_t oneWireDevice;
  if(reset() == 0) {
    writeByte(CMD_READROM);
    //  код семейства
    oneWireDevice = readByte();
    // серийный номер
    oneWireDevice |= (uint16_t)readByte()<<8 | (uint32_t)readByte()<<16 | (uint32_t)readByte()<<24 | (uint64_t)readByte()<<32 | (uint64_t)readByte()<<40 | (uint64_t)readByte()<<48;
    // CRC
    oneWireDevice |= (uint64_t)readByte()<<56;
  } else {
    return 1;
  }
  return oneWireDevice;
}
 
/*
 * Команда соответствия ROM, сопровождаемая последовательностью 
 * кода ROM на 64 бита позволяет устройству управления шиной 
 * обращаться к определенному подчиненному устройству на шине.
 */
void setDevice(uint64_t rom) {
  uint8_t i = 64;
  reset();
  writeByte(CMD_MATCHROM);
  while (i--) {
    writeBit(rom & 1);
    rom >>= 1;
  }
}
 
/*
 * провеска CRC, возвращает "0", если нет ошибок
 * и не "0", если есть ошибки
 */
uint8_t crcCheck(uint64_t data8x8bit, uint8_t len) {
  uint8_t dat, crc = 0, fb, stByte = 0;
  do {
    dat = (uint8_t) (data8x8bit >> (stByte * 8));
    for (int i = 0; i < 8; i++) {  // счетчик битов в байте
      fb = crc ^ dat;
      fb &= 1;
      crc >>= 1;
      dat >>= 1;
      if (fb == 1) {
        crc ^= 0x8c; // полином
      }
    }
    stByte++;
  } while (stByte < len); // счетчик байтов в массиве
  return crc;
}
 
 
/*
 * поиск следующего подключенного устройства
 */
uint64_t searchNextAddress(uint64_t lastAddress, uint8_t * lastDiscrepancy) {
  uint8_t searchDirection = 0;
  uint64_t newAddress = 0;
  uint8_t idBitNumber = 1;
  uint8_t lastZero = 0;
  reset();
  writeByte(CMD_SEARCHROM);
 
  while (idBitNumber < 65) {
    uint8_t idBit = readBit();
    uint8_t cmpIdBit = readBit();
 
    // id_bit = cmp_id_bit = 1
    if (idBit == 1 && cmpIdBit == 1) {
      return DEVICES_ERROR;
    } else if (idBit == 0 && cmpIdBit == 0) {
      // id_bit = cmp_id_bit = 0
      if (idBitNumber == *lastDiscrepancy) {
        searchDirection = 1;
      } else if (idBitNumber > *lastDiscrepancy) {
        searchDirection = 0;
      } else {
        if ((uint8_t) (lastAddress >> (idBitNumber - 1)) & 1) {
          searchDirection = 1;
        } else {
          searchDirection = 0;
        }
      }
      if (searchDirection == 0) {
        lastZero = idBitNumber;
      }
    } else {
      // id_bit != cmp_id_bit
      searchDirection = idBit;
    }
    newAddress |= ((uint64_t) searchDirection) << (idBitNumber - 1);
    writeBit(searchDirection);
    idBitNumber++;
  }
  *lastDiscrepancy = lastZero;
  return newAddress;
}
 
/*
 * поиск устройств
 */
void searchRom(uint64_t * roms, uint8_t * n) {
  uint64_t lastAddress = 0;
  uint8_t lastDiscrepancy = 0;
  uint8_t err = 0;
  uint8_t i = 0;
  do {
    do {
      lastAddress = searchNextAddress(lastAddress, &lastDiscrepancy);
      if(lastAddress != DEVICES_ERROR) {
        uint8_t crc = crcCheck(lastAddress, 8);
        if (crc == 0) {
          roms[i++] = lastAddress;
          err = 0;
        } else {
          err++;
        }
      } else {
        err++;
      }
      if (err > 3) {
        return;
      }
    } while (err != 0);
  } while (lastDiscrepancy != 0 && i < *n);
  *n = i;
}
 
 
 
/*
 * пропустить ROM
 */
void skipRom() {
  reset();
  writeByte(CMD_SKIPROM);
}

Текст в main:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#define F_CPU               16000000UL
//================ОТНОСИТСЯ К 1-WIRE================
#define ONE_WIRE_PORT      PORTB
#define ONE_WIRE_DDR       DDRB
#define ONE_WIRE_PIN       PINB
//==============================================
//#include <asf.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <math.h>
//#include <avr/interrupt.h>
 
//#include "сonfig.h"
 
#include "OwnWire.h"
 
#include "OLED_Function.h" //включает функции для работы дисплея
#include "drawing.h"       //включает функции по прорисовке на дисплее определенных элементов, а также массивы шрифтов
#include "function_clock.h"
 
 
 
char Rel1 = 5;//переменные для хранения вкл/выкл реле
char Rel2 = 7;
char Rel3 = 9;
char Rel4 = 11;
char Rel5 = 13;
char D_time = 4;//переменная для хранения значения день- ночь
 
char hoursH = 0;//переменные для сохранения байтов с часов и вывода на экран
char hoursL = 0;
char minutesH = 0;
char minutesL = 0;
char colon = 10;//:
char secondsL = 0;
char secondsH = 0;
 
char int_t1 = 28;//переменные для хранения уставок температур и времени в формате +/- ХХ
char int_t2 = 99;
char int_t3 = 0;
char ext_t = 0;
 
char seconds = 0; //непереработанные данные с часов
char minutes = 0;
char hours = 0;
char days = 0;
char monthes = 0;
char years = 0;
char weekday = 0;
 
char hour_transf=0;//переработанные часы
 
char int_t1H = 0;//старшие и младшие разряды температур
char int_t1L = 0;
char sign1 =0;
char int_t2H = 0;
char int_t2L = 0;
char int_t3H = 0;
char int_t3L = 0;
char ext_tH = 0;
char ext_tL = 0;
 
char temperatura1=0;//с часов
char temperatura2=99;
char temperatura3=33;
char temperatura4=00;//уличная t
 
//char h=23; //уставки для записи времени в ds3231
//char m=00;
//char s=0;
 
//============ОТНОСИТСЯ К 1-WIRE===============================
char getTemp(uint64_t ds18b20s) { // must contain 64 bit
    char temperatureL=0;
    char temperatureH=0;
    char retd = 0;
 
 
    setDevice(ds18b20s);
    writeByte(CMD_CONVERTTEMP);
 
    _delay_ms(750);
 
    setDevice(ds18b20s);
    writeByte(CMD_RSCRATCHPAD);
 
    temperatureL = readByte();
    temperatureH = readByte();
 
    retd = ((temperatureL>>4)&0b00001111)|((temperatureH<<4)&0b01110000);       //прокатит, если положительная температура, вывод целых градусов.
//!!!!!!!!!!!!!!!!!!!!!!!!тут ставил выражения типа retd = 27; - дисплей выводит 27гр.
 
return retd;}
//==========================================================
 
int main(void){
    //board_init();
    DDRC |= (1<<0)|(1<<1)|(1<<2)|(1<<3);
    PORTC &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3));
    
    
    static_elements();                      //вывод статичных элементов на экран
    //ds3231_init();                //инициализация часов ds3231
    //ds3231_write_time(h,m,s);     //запись времени в часы
    
    //====================ОТНОСИТСЯ К 1-WIRE===============
    oneWireInit(PINB1);
    
    char n = 3;
    long long roms[n];                  //нужно вместить 64 бита
    searchRom(roms, &n);
    _delay_ms(2000);
    //=================================================
    
    while (1)
    {
        //=================ОТНОСИТСЯ К 1-WIRE===============
        temperatura2 = getTemp(roms[0]);     
        temperatura3 = getTemp(roms[1]);
        temperatura4 = getTemp(roms[2]);
        _delay_ms(1000);
        
        //==============================================
        
        ds3231_read_temper(&int_t1H,&int_t1L, &sign1, &temperatura1);//передал адреса переменных, куда часы сохранят температуру и знак
        ds3231_read_time(&seconds,&minutes,&hours,&days,&monthes,&years,&weekday);
        
        minutesL = minutes&0b00001111;
        minutesH = ((minutes&0b01110000)>>4);
        hour_transf = (((hours & 0xF0) >> 4)*10)+(hours & 0x0F);
        hoursL = hours&0b00001111;
        hoursH = ((hours&0b01110000)>>4);
        secondsL = seconds&0b00001111;
        secondsH = ((seconds&0b01110000)>>4);
        
        drawing_clock(hoursH,hoursL,minutesH,minutesL,colon);
        
        temper_transform(temperatura2,&int_t2H,&int_t2L);//по указателю
        temper_transform(temperatura3,&int_t3H,&int_t3L);
        temper_transform(temperatura4,&ext_tH,&ext_tL);
        
        if(temperatura1<int_t1) {       //реле1 в зависим от t1
            Rel1=6;
            PORTC |= (1<<2);
        }
        else {
            Rel1=5;
            PORTC &= ~(1<<2);
        }
        
        drawing_temperatures(ext_tH,int_t1H,ext_tL,int_t1L,int_t2H,int_t3H,int_t2L,int_t3L);
        
        if((hour_transf>0 && hour_transf<7) || (hour_transf==23)){//в ночное время вкл бойлер на 0 пине порта C
            D_time=15;
            PORTC |= (1<<0);
            Rel5 = 14;
        }
        else {                          //днем горит солнышко и бойлер выкл
            D_time=4;
            PORTC &= ~(1<<0);
            Rel5 = 13;
        }
        
        drawing_relay (Rel1,Rel2,Rel3,Rel4,Rel5,D_time);//вывод реле и времени дня
 
 
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
        _delay_ms(1000);
        PORTC |= (1<<3);
        _delay_ms(1000);
        PORTC &= ~(1<<3);
    }
}

Добавлено через 18 минут
да, подлючал gnd, 5v, а между ними на пин В1 с подтяжкой к нему 5v через резистор 4, потом еще 10 кОм пробовал

Добавлено через 1 час 2 минуты
написал проверку присутствия устройств на шине, если ответа нет, то мигает диод — мигает бл…. Ответа нет. Что делать?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uint8_t reset() {
  uint8_t response=0;
 
  // импульс сброса, минимум 480us
  ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход
  ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ);//0
  _delay_us(480);
 
  // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us
  ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход
  _delay_us(65);
 
  // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us.
  response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ));
  _delay_us(250);
  if (response){
      PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
        _delay_ms(200);
        PORTC |= (1<<3);
        _delay_ms(200);
        PORTC &= ~(1<<3);
  }
  // если 0, значит есть ответ от датчика, если 1 - нет
  return response;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();

    // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print(«Error getting temperature»);
  } else {
    Serial.print(«C: «);
    Serial.print(tempC);
    Serial.print(» F: «);
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{
  delay(2000);
  Serial.print(«Getting temperatures…nr»);
  sensors.requestTemperatures();

    Serial.print(«Inside temperature is: «);
  printTemperature(insideThermometer);
  Serial.print(«nr»);
  Serial.print(«Outside temperature is: «);
  printTemperature(outsideThermometer);
  Serial.print(«nr»);
  Serial.print(«Dog House temperature is: «);
  printTemperature(dogHouseThermometer);
  Serial.print(«nrnr»);
}

GND — GND
VDD + 5V
DQ — к 3-му порту.
Причем VDD и DQ соединены резистором 4,7 кОм
В коде присутствует определение ошибки, ошибки на температуру «-127»
Вопрос: почему этот датчик может такое выдавать, вроде все правильно подключил?
Все делал по статье:
http://cxem.net/arduino/arduino17.php

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Ds0300 ошибка фанук
  • Ds error алпайн
  • Dryview 5700 ошибка 935
  • Drwtsn32 exe обнаружена ошибка как исправить
  • Drw c 5 10 fatal error x11 xlib h no such file or directory

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии