Контрольные весы для пасеки с отправкой данных в SMS

VadimZ
Offline
Зарегистрирован: 08.10.2017

Интересное предложение.

можно ли этим контроллером передать данные по протоколу MODbas TCP ?

xzeus
Offline
Зарегистрирован: 15.07.2015

можно но Проблематично:

1. Ping большой.

2. нужна симка со статическим IP - а это денег стоит.

Другим путем иду, на сервере ставить придется  OPC server чтоб на скаду завести

VadimZ
Offline
Зарегистрирован: 08.10.2017

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

xzeus
Offline
Зарегистрирован: 15.07.2015

Кое что профиксил https://yadi.sk/d/P1qUIIhZ3P4F2j

SMS., сервак слушает но не отправляет- надо формировать структуру с данными для отправки (состояние ног, датчики, модбас)

 whats.new внутри

 

VadimZ
Offline
Зарегистрирован: 08.10.2017

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

garyn1976
Offline
Зарегистрирован: 25.10.2017

BFF пишет:

kot55 пишет:

https://www.youtube.com/playlist?list=PLFYaQ7NVz7qyYOXabki0nZOXXcH98wM5j

Под вторым видео в коментариях.

Вот прямая сылка на форум : http://beelovepro.0bb.ru/viewtopic.php?id=12

Коллеги, я всегда тихо подслушиваю....  если будут вопросы по моему проекту, я готов.

Но не в силах тратить на вас время изменяя что то. Но всегда готов пдсказать, пишите.

Прекрасный материал! Спасибо Огромное! все четко расписано с хорошими комментариями и пояснениями. Написано доступным языком - восторг полный!

Я новичек в программировании в целом и в работе с ардуиной в частности. Делаю себе весы на пасеку.

Ардуино уно, часы (с температурой), жсм, олед дисплейчик, весы 711. В планах еще DHT22 прикрутить.

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

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

По Вашему коду возникло пара вопросов изза моей слабой компетенции и если не сложно то помогите, пожалуйста, разобраться:

1. зачем миллис делится на 1000? (я использую миллис - но просто сравниваю текуще значение миллис с запомненным последним и если больше указанного количества миллисекунд - то действие). Т.е. мой вопрос про то - что дает деление на 1000? туплю и не могу сообразить.

2. не понял строку "wdt_enable (WDTO_8S); // ВАЖНО - не включать просто так. Надо менять загрузчик. Если не поменять то процессор упадет в BootLoop. "

не нашел в коде функцию wdt_enable () - хотя вызов этой функции встречается достаточно часто.

wdt_disable(); встречается один раз и тоже не понятно что это (подтягивается из какойто библиотеки?)

3. asm volatile ("  jmp 0"); видимо тоже из того же источника - не понял что оно делает и почему :о(

Если не сложно, то поясните подробнее что это или одарите ссылкой на описание

 

от себя хочу вложить "пять копеек" - можети не нужные но вдруг пригодится:

  //eeprom long функция записи большого числа в энергонезависимую память. 4 байта
  //This function will write a 4 byte (32bit) long to the eeprom at
//the specified address to address + 3.
void EEPROMWritelong(int address, long value)
      {
      //Decomposition from a long to 4 bytes by using bitshift.
      //One = Most significant -> Four = Least significant byte
      byte four = (value & 0xFF);
      byte three = ((value >> 8) & 0xFF);
      byte two = ((value >> 16) & 0xFF);
      byte one = ((value >> 24) & 0xFF);

      //Write the 4 bytes into the eeprom memory.
      EEPROM.write(address, four);
      EEPROM.write(address + 1, three);
      EEPROM.write(address + 2, two);
      EEPROM.write(address + 3, one);
      }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to address + 3.
long EEPROMReadlong(long address)
      {
      //Read the 4 bytes from the eeprom memory.
      long four = EEPROM.read(address);
      long three = EEPROM.read(address + 1);
      long two = EEPROM.read(address + 2);
      long one = EEPROM.read(address + 3);

      //Return the recomposed long by using bitshift.
      return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
      }

У вас запись в энергонезависимую память встречается часто. Но используется 3 байта, т.е. это реализовано для экономии места в памяти или по другой причине?

 

Ой чуть не забыл еще один вопрос - у меня показания тензодатчиков минусовые и коэффициент соответственно тоже минусовой - это я чтото не правильно собрал или это нормальное явление?

Показания весов плавают в пределах 100 грамм туда сюда. это меня печалит но надеюсь это изза того что все собрано на коленке и провода не заэкранированы? тензодатчиков 4 штуки на 50кг.

BFF
Offline
Зарегистрирован: 25.10.2015

Здравствуйте. 

Сейчас я в поездке и отвечать с планшета сложно.

Можететприслать все вопросы на sergey@beloff.ru

Как приземлюсь в Москве, вечерком отпишу.

b707
Онлайн
Зарегистрирован: 26.05.2017

garyn1976 пишет:

 

1. зачем миллис делится на 1000? (я использую миллис - но просто сравниваю текуще значение миллис с запомненным последним и если больше указанного количества миллисекунд - то действие). Т.е. мой вопрос про то - что дает деление на 1000? туплю и не могу сообразить.

миллис - это время в миллисекундах, соответственно миллис/1000 - это секунды.

garyn1976 пишет:
2. не понял строку "wdt_enable (WDTO_8S); // ВАЖНО - не включать просто так. Надо менять загрузчик. Если не поменять то процессор упадет в BootLoop. "

это ватчдог-таймер (watchdog - погуглите, что это и как использовать)

garyn1976 пишет:
от себя хочу вложить "пять копеек" - можети не нужные но вдруг пригодится:

//eeprom long функция записи большого числа в энергонезависимую память. 4 байта

Вы,  вероятно, пользовались старыми примерами для библиотеки EEPROM. В новой версии есть функции EEPROM.put() и get(). которые пишут в епром любые стандартные типы данных, в том числе лонг

 
garyn1976
Offline
Зарегистрирован: 25.10.2017

b707 пишет:

Спасибо!

kot55
Offline
Зарегистрирован: 14.06.2016

garyn1976 пишет:

BFF пишет:

kot55 пишет:

https://www.youtube.com/playlist?list=PLFYaQ7NVz7qyYOXabki0nZOXXcH98wM5j

Под вторым видео в коментариях.

Вот прямая сылка на форум : http://beelovepro.0bb.ru/viewtopic.php?id=12

Коллеги, я всегда тихо подслушиваю....  если будут вопросы по моему проекту, я готов.

Но не в силах тратить на вас время изменяя что то. Но всегда готов пдсказать, пишите.

Ой чуть не забыл еще один вопрос - у меня показания тензодатчиков минусовые и коэффициент соответственно тоже минусовой - это я чтото не правильно собрал или это нормальное явление?

Показания весов плавают в пределах 100 грамм туда сюда. это меня печалит но надеюсь это изза того что все собрано на коленке и провода не заэкранированы? тензодатчиков 4 штуки на 50кг.

По поваду тензодатчиков по всей видемости вы не правельно собрали мост, и соответствено не правельно подключили. Мои веса работают нормально и без экранирования. Это видно на видео.

garyn1976
Offline
Зарегистрирован: 25.10.2017

kot55 пишет:

 

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

 

да вроде так. минус может быть у кого-то еще такое случается? это бы по идее надо было перевернуть S+S-? тогда минусы будет казать?

xzeus
Offline
Зарегистрирован: 15.07.2015

Веду разработку контроллера на ардуино с модемом NeowayM590 через GPRS

скоро закончу программу для контроллера, может кто поможет с серваком

Сервак должен уметь получать данные от контроллера и отдавать в скаду через OPC Server

Написанный мной сервер на C# кривой, надо с нуля переписывать. Но тем не менее работает и даные от ардуины отображает  (исходник контроллера и кривого сервера прилагается)

https://yadi.sk/d/Q2kjreHX3PBL4Q

whats new--------------
+ добавлено
- bugfix
! глюк надо исправлять , недоработка доделываь


v0.0.0 - 0.4.4 
		+base module, Init module, ip, tcp, DNS, SMS, text-заголовок с командами модема   
v0.4.5 
		+UDP(NTP),call module
		-base moule->ask функция возвращает 3 состояния да нет небыло (1 0 -1)
		-!call module переписан
v0.5.0  +Чтение СМС без удаления
		!перестал выходить в интернет возможно иизза симки
v0.5.2  -udp ntp восстановлен
		-интернет работает
v0.5.3  -Строгая экономия оперативки все const переписаны в define
		-смс возвращает порядковый номер
		+можно удалять смс по порядковому номеру
v0.5.7  !buffer size is 64 bytes. fix переполнение
V0.6.0  +getEvent ожидание событий от модема
		+АОН если входящий звонок то определяется номер в виде строки (сейчас никуда не используется)
        !SMS работает только  №1 смс 
V0.6.1  -SMS работает
V0.6.2  -SMS опрашивает через "AT+CMGL=4" было перебором "AT+CMGR=" 
V0.7.0  +LOOP слушаем сервер читаем СМС
v0.7.1  -Оперативки добавилось   Serial.print(" answer: ") ->  Serial.print(F(" answer: "));
		-LOOP переписал удобнее
v0.7.2  +Понимает полноценно команду сервера TIME: и INFO:

Недоделано:
		!при переполнении millis() будет глючить время ~50дней 
		!возможно надо периодично перегружать модем и ардуину
		!Команды через СМС прикрутить (оперативку освободил)
		!Обработка входов и помещения их в структуру отправки
		!команда OUT: -обработка
		!команда RS485: (модбас) -обработка
		!Сервак с OPC server (который написал косой - исходник c# приложен)

 

b707
Онлайн
Зарегистрирован: 26.05.2017

xzeus - ради интереса глянул код. Оставляет двоякое впечатление. С одной стороны. видно. что написано не глухим чайником, а человеком, которые что-то знает. С другой стороны, код очень пестрый, куча неэффективных решений, ляпов и даже грубых ошибок.

Так, немного для иллюстрации, на примере m590.cpp(от простого к сложному) :

= пишете, что боретесь с переполнением оперативки - а сами вовсю используете в коде String - крайне неэффективный ( в смысле расходования памяти) метод работы со строками

= опять на тему оперативки - в некоторых операторах print даже крохотные строки в 3-4 символа упрятаны в макрос F() (практически бессмысленное занятие) - зато огромный массив const char* sEvents в начале файла . длиной, наверно, байтов 80 - лежит в основной оперативке, хотя должен быть в PROGMEM

= в функциях ask, getString, getParam - везде временной интервал TT вычисляется неверно - будет глючить при переполнении millis()

= функция getString возвращает по значению локальный обьект типа String - это грубая ошибка, так делать категорически нельзя, - верный путь к глюкам памяти

= то же самое в функции getEvent

Дальше не смотрел. В общем, этот код стоит основательно "причесать", прежде чем предлагать кому-то еще.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

= функция getString возвращает по значению локальный обьект типа String - это грубая ошибка, так делать категорически нельзя, - верный путь к глюкам памяти

Это типо такого:

String getString()
{
  String s = "Hello!";
  return s;
}

? Если да - не парьтесь, никаких глюков - оператор копирования, и конструктор копирования - в исходниках String присутствуют, этот код ОБЯЗАН работать без проблем.

xzeus
Offline
Зарегистрирован: 15.07.2015

Контроллер из ардуино с модем m590 продвигается:

Данные c входов собираются и отправляются на сервер.

https://yadi.sk/d/Y6CbTTcE3PCjo9

осталось доделать:

1.SMS

2.Дистанционное релейное управление

3.модбас

ну и сервак написать полноценный

ЗЫ то что у меня говнокод, я и сам знаю (не стреляйте в пианиста, он играет как может)

b707
Онлайн
Зарегистрирован: 26.05.2017

xzeus пишет:

ЗЫ то что у меня говнокод, я и сам знаю (не стреляйте в пианиста, он играет как может)

разберитесь хотя бы с использованием оперативки - а то очень скоро опять упретесь в нехватку памяти. Выкиньте String, положите длинные массивы и строки в PROGMEM, а вот макросом F() увлекаться не стоит, для коротких или повторяющихся строк он приносит больше вреда, чем пользы.

garyn1976
Offline
Зарегистрирован: 25.10.2017

kot55 пишет:

 

По поваду тензодатчиков по всей видемости вы не правельно собрали мост, и соответствено не правельно подключили. Мои веса работают нормально и без экранирования. Это видно на видео.

Собрал новый hx711 и новые датчики по этой схеме и снова получился минусовой коэфициент. Но у меня вместо S на плате A.

запутался совсем :о(...что можно перекинуть между собой чтобы полярность поменялась?

VadimZ
Offline
Зарегистрирован: 08.10.2017

http://arduino.ru/forum/proekty/kontrolnye-vesy-dlya-paseki-s-otpravkoi-... тут же схема на второй странице этого же форума

garyn1976
Offline
Зарегистрирован: 25.10.2017

Свершилось! Я и так и так пробовал, все в минуса уходил. В итоге выявилось, что при сборке тензодатчиков одна пара перекрутилась и под изолентой это небыло видно. прошу пардону у всех сопереживающих! В свое оправдание могу сказать только цитатой "не ошибается только тот, кто ничего не делает..." :о)

Еще раз всем спасибо!

garyn1976
Offline
Зарегистрирован: 25.10.2017

OLED дисплей. Прошу помощи...

использую библиотеку OLED_I2C.h

Все хорошо, все работает, изображение есть, но:

Если физически отключить от весов, а потом снова подключить, то уже не выдает изображение.

Как-то нужно заново проинициализировать в loop?

в области объявления стоит

OLED  myOLED(SDA, SCL, 8); 

в setup стоит:

myOLED.begin();

в loop просто вывод информации на экран.

Как сделать так, чтобы после отключения/подключения экрана - изображение не пропадало?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

OLED дисплей. Прошу помощи...

Если физически отключить от весов, а потом снова подключить, то уже не выдает изображение.

Как сделать так, чтобы после отключения/подключения экрана - изображение не пропадало?

А какой сакральный смысл в этом онанизме? Вы собираетесь постоянно отключать/подключать экран? Он должен быть постоянно подключён, другое - от лукавого.

BFF
Offline
Зарегистрирован: 25.10.2015

Необходимо заново отправлять команды инициализации.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

кой сакральный смысл в этом онанизме? Вы собираетесь постоянно отключать/подключать экран? Он должен быть постоянно подключён, другое - от лукавого.

Почему он должен быть постоянно подключен к весам на пасеке?

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

Планируется приезжать на пасеку и при необходимости подключать экран, а потом отключать его. Или вообще один экран использовать на несколько весов, если захочется визуально посмотреть на состояние дел.

garyn1976
Offline
Зарегистрирован: 25.10.2017

BFF пишет:

Необходимо заново отправлять команды инициализации.

я попробовал но видимо как-то криво... просто мерцать постоянно начал экран.

А есть ли какая-то возможность "нюхать" состояние? типа подключен или нет дисплей?

BFF
Offline
Зарегистрирован: 25.10.2015

Вы дисплей, вас включили, сказали, работать вот так, ждать вот это отображать таким образом. Пошли данные, вы все делаете.

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

 

Капайте в направлении команд инициализации.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

BFF пишет:

Необходимо заново отправлять команды инициализации.

я попробовал но видимо как-то криво... просто мерцать постоянно начал экран.

А есть ли какая-то возможность "нюхать" состояние? типа подключен или нет дисплей?

Если хотите постоянно подключать/отключать - сделайте контроль на ещё одном пине: если там появился низкий уровень - значит, дисплей подключён. Если там высокий - значит, дисплей отключили. Пин подтянут к питанию через 10К, на платке с дисплеем эта линия садится на землю, вот вам и программный контроль доступности дисплея: как только поймали высокий уровень - выставили флаг, что дисплей надо инициализировать сразу после того, как поймаете низкий уровень на линии контроля. Всё просто.

BFF
Offline
Зарегистрирован: 25.10.2015

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

garyn1976
Offline
Зарегистрирован: 25.10.2017

BFF пишет:

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

Да, я тоже сделал раз в 6 секунд. моргает но наверное не критично. может быть действительно добавить до 20 секунд. на пасеке 20 секунд (в максимальном случае) до включения экрана скорее всего не будет иметь никакого значения.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

Если хотите постоянно подключать/отключать - сделайте контроль на ещё одном пине: если там появился низкий уровень - значит, дисплей подключён. Если там высокий - значит, дисплей отключили. Пин подтянут к питанию через 10К, на платке с дисплеем эта линия садится на землю, вот вам и программный контроль доступности дисплея: как только поймали высокий уровень - выставили флаг, что дисплей надо инициализировать сразу после того, как поймаете низкий уровень на линии контроля. Всё просто.

Спасибо! думал над этим, но не хватает квалификации "нюхать" такой пин да еще через какое-то 10К (кстати что это? резистор?). Просто-то - оно все на свете просто, но по первости и ходить трудно. в ардуино я пока "ползаю" :о) или даже просто переворачиваюсь :о)))

а как это если пин к питанию, а на плате на землю? земля и питание это же разные ноги?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

а как это если пин к питанию, а на плате на землю? земля и питание это же разные ноги?

Видимо, вам следует почитать самые начала, про подтяжки, резисторы, и прочее простое в том же духе ;) На ютюбе есть уроки Джереми Блума в переводе Амперки - гляньте.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

Видимо, вам следует почитать самые начала, про подтяжки, резисторы, и прочее простое в том же духе ;) На ютюбе есть уроки Джереми Блума в переводе Амперки - гляньте.

Спасибо большое!

Уже смотрю.

есть нюанс... у меня на линии питания кроме экрана висят еще часы RTC.

Получается, что слушать хай или лоу пина питания дисплея не получится?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

есть нюанс... у меня на линии питания кроме экрана висят еще часы RTC.

Получается, что слушать хай или лоу пина питания дисплея не получится?

С чего бы это? Давайте ещё раз повторю: К пину ардуины подключен провод, от этого провода идёт на 5В резистор 10К. Другой конец провода, наряду с линиями данных дисплея, подтыкается на платку, на которой распаян дисплей. Разъём, куда подтыкается этот провод, на плате заведён на GND через тот же резистор, но меньшего номинала, например, 1К.

По итогу: когда к этой линии ничего не подключено - на пине ардуины присутствует +5В, т.е. HIGH. Как только вы подключили дисплей - на этом пине становится 0В, т.е. LOW. И анализируя состояние этого пина - можно всегда сказать: подключен ли дисплей, были ли подключен вообще, был подключен и отключен и т.п. По итогу анализа можно переинициализировать дисплей.

Код может выглядеть примерно так:

bool isDisplayPresent = false;
const int displayStatusPin = 5;

void InitDisplay()
{
 // тут переинициализируем дисплей
}

void setup()
{
 pinMode(displayStatusPin, INPUT);
 isDisplayPresent  = !digitalRead(displayStatusPin);
  if(isDisplayPresent ) InitDisplay();
}

void loop()
{
   if(isDisplayPresent)
   {
     if(digitalRead(displayStatusPin))
     {
       isDisplayPresent  = false;
     }
   }

   if(!isDisplayPresent)
   {
      isDisplayPresent  = !digitalRead(displayStatusPin);
      if(isDisplayPresent)  InitDisplay();
   }
} 

Примерно так.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

 

Примерно так.

ооо.... кажется начинаю понимать. Спасибо!!!

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

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

 К пину ардуины подключен провод, от этого провода идёт на 5В резистор 10К. Другой конец провода, наряду с линиями данных дисплея, подтыкается на платку, на которой распаян дисплей. Разъём, куда подтыкается этот провод, на плате заведён на GND через тот же резистор, но меньшего номинала, например, 1К.

 

Примерно так.

я правильно понял?

xzeus
Offline
Зарегистрирован: 15.07.2015

Продолжает развиваться проект по сбору данных с ардуино и посылке gprs модем на сервер.

Смотрите Read.my и whats.new в архиве.

Следующим шагом прикручу к ардуине модбас для опроса внешнего оборудования.

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

https://yadi.sk/d/j93_oB-W3PmPhr

garyn1976
Offline
Зарегистрирован: 25.10.2017

xzeus пишет:

Продолжает развиваться проект по сбору данных с ардуино и посылке gprs модем на сервер.

Смотрите Read.my и whats.new в архиве.

Следующим шагом прикручу к ардуине модбас для опроса внешнего оборудования.

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

https://yadi.sk/d/j93_oB-W3PmPhr

не знаю поможет ли ибо сам не очень но...

конструкции типа:

  if(aDrb1<millis())  
   {
    _cnt1++;
    aDrb1=millis()+aTime1;
   }

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

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

http://arduino.ru/forum/programmirovanie/eshche-raz-migaem-svetodiodom-b...

b707
Онлайн
Зарегистрирован: 26.05.2017

garyn1976 пишет:

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

автору об этом уже говорилось - он ответил что-то в стиле "знаю, что у меня говнокод - но мне пофиг, пишу как могу". Непонятно только, зачем при таком отношении выкладывать свое "творчество" для других.

xzeus
Offline
Зарегистрирован: 15.07.2015

миллис переполняется раз в 49,7 дней.

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

Спасибо за обнаруженный баг...

пока можно воспользоваться перегрузкой по смс для этого послать "pWd SMS:4" 

В следующей версии перегрузку по таймеру поправлю.

Проо говнокод не отказываюсь- читаю книжки по C++  и на ходу делаю и переделываю, а последние участки кода под С написаны, чтоб оперативку сберечь.

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

xzeus пишет:

миллис переполняется раз в 49,7 дней.

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

Вы очередной адепт церкви святого Миллиса сорокдевятого дня?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

bwn пишет:

xzeus пишет:

миллис переполняется раз в 49,7 дней.

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

Вы очередной адепт церкви святого Миллиса сорокдевятого дня?

Он не очередной, он следующий :)

xzeus
Offline
Зарегистрирован: 15.07.2015

DIYMan пишет:

bwn пишет:

xzeus пишет:

миллис переполняется раз в 49,7 дней.

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

Вы очередной адепт церкви святого Миллиса сорокдевятого дня?

Он не очередной, он следующий :)

Очень грубо, я вроде как должен в ответ огрызаться?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

xzeus пишет:

DIYMan пишет:

bwn пишет:

xzeus пишет:

миллис переполняется раз в 49,7 дней.

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

Вы очередной адепт церкви святого Миллиса сорокдевятого дня?

Он не очередной, он следующий :)

Очень грубо, я вроде как должен в ответ огрызаться?

Не должен, но обязан - здесь так принято. Огрызайся, быро! :) 

З.Ы. А если серьёзно - суслика нет. Как нет и проблемы переполнения millis, тебя кто-то развёл. Автоперегрузка раз в два часа, которой похер на переполнение millis:

unsigned long past;

void setup()
{
past = millis();
}

void loop()
{
    unsigned long now = millis();
    if(now - past > 3600000*2)
   {
      past = now;
     АВТОПЕРЕГРУЗКА, ЩИТ!!!!!!
   }
}

Где ты тут видишь проблему пресвятых сорока девяти с каким-то хером дней?

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

 

З.Ы. А если серьёзно - суслика нет. Как нет и проблемы переполнения millis, тебя кто-то развёл. Автоперегрузка раз в два часа, которой похер на переполнение millis:

unsigned long past;

void setup()
{
past = millis();
}

void loop()
{
    unsigned long now = millis();
    if(now - past > 3600000*2)
   {
      past = now;
     АВТОПЕРЕГРУЗКА, ЩИТ!!!!!!
   }
}

Где ты тут видишь проблему пресвятых сорока девяти с каким-то хером дней?

я вроде здесь же вычитал на этом форуме про миллис, что при сбросе его в ноль при переполнении - оно все равно обсчитывает корректно, ибо unsigned long .

бага появляется если к миллис плюсовать. а если минусовать - то все работает корректно даже без проверки на переполнение.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

К пину ардуины подключен провод, от этого провода идёт на 5В резистор 10К. Другой конец провода, наряду с линиями данных дисплея, подтыкается на платку, на которой распаян дисплей. Разъём, куда подтыкается этот провод, на плате заведён на GND через тот же резистор, но меньшего номинала, например, 1К.

По итогу: когда к этой линии ничего не подключено - на пине ардуины присутствует +5В, т.е. HIGH. Как только вы подключили дисплей - на этом пине становится 0В, т.е. LOW. И анализируя состояние этого пина - можно всегда сказать: подключен ли дисплей, были ли подключен вообще, был подключен и отключен и т.п. По итогу анализа можно переинициализировать дисплей.

Код может выглядеть примерно так:

bool isDisplayPresent = false;
const int displayStatusPin = 5;

void InitDisplay()
{
 // тут переинициализируем дисплей
}

void setup()
{
 pinMode(displayStatusPin, INPUT);
 isDisplayPresent  = !digitalRead(displayStatusPin);
  if(isDisplayPresent ) InitDisplay();
}

void loop()
{
   if(isDisplayPresent)
   {
     if(digitalRead(displayStatusPin))
     {
       isDisplayPresent  = false;
     }
   }

   if(!isDisplayPresent)
   {
      isDisplayPresent  = !digitalRead(displayStatusPin);
      if(isDisplayPresent)  InitDisplay();
   }
} 

Примерно так.

на 5м пине 1 выскакиевт кратковременно и больше не симафорит :о(. сериал принт один - два раза (видимо в зависимости от дребезга) выводит 1, а потом только нули - соотвтетвенно когда экран снова подтыкается - то условие не срабатывает. может быть как-то можно еще перечитывать 5 пин так, чтобы 5 вольт воспринималось постоянно как сигнал?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

на 5м пине 1 выскакиевт кратковременно и больше не симафорит :о(. сериал принт один - два раза (видимо в зависимости от дребезга) выводит 1, а потом только нули - соотвтетвенно когда экран снова подтыкается - то условие не срабатывает. может быть как-то можно еще перечитывать 5 пин так, чтобы 5 вольт воспринималось постоянно как сигнал?

В приведённом примере за стутус "дисплей подключён" отвечает НИЗКИЙ уровень на пине (необязательно на пятом, выбирайте любой свободный). ВЫСОКИЙ уровень на пине должен быть, когда дисплей не подключён, это решается аппаратно, код лишь проверяет уровни, антидребезга в нём нет, допишите, если надо. Не забывайте - это только ПРИМЕР.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

В приведённом примере за стутус "дисплей подключён" отвечает НИЗКИЙ уровень на пине (необязательно на пятом, выбирайте любой свободный). ВЫСОКИЙ уровень на пине должен быть, когда дисплей не подключён, это решается аппаратно, код лишь проверяет уровни, антидребезга в нём нет, допишите, если надо. Не забывайте - это только ПРИМЕР.


Спасибо!
В том, то и проблема, что низний уровень появляется почти сразу после отключения экрана. А так как в программе переключается флаг, то после появления нулей срабатывает переинициализация экрана. Срабатывает в холостую ибо экран-то отключен, но флаг сброшен и больше не выставляется. Поэтому при подключении экрана, на 5 пине не появляется снова лоу.
А вот если провод именно сигнального пина(после подтыкания экрана) отключить и снова подключить, то сигнал появляется и экран переинициализируется.
У меня ардуино уно, может быть 5 пин с шимом и поэтому он так себя ведет?

И замечена еще одна проблема. Бывает так, что ардуино зависает при подключении/отключении экрана. Это нормально или у меня бракованная ардуинка? И есть ли какаято возможность бороться с такрм зависом?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:
В том, то и проблема, что низний уровень появляется почти сразу после отключения экрана.

Эмм. Не знаю, что вы там собрали, но подтяжка к питанию этого пина должна быть на стороне ардуины. По поводу зависаний - от помех дунька сходит с ума, это тоже вопрос схемотехники. Можно сигнальный пин опторазвязать, как вариант.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

Эмм. Не знаю, что вы там собрали, но подтяжка к питанию этого пина должна быть на стороне ардуины. По поводу зависаний - от помех дунька сходит с ума, это тоже вопрос схемотехники. Можно сигнальный пин опторазвязать, как вариант.

1. Линия 5В приходит на GND OLED дисплея через 10К резистор.

2. от GND OLED дисплея уходит провод на индикаторный пин.

3. GND OLED дисплея заведен на минус через 1К резистор.

 

Как я это понимаю в рамках своих жалких познаний:

1. электричество бежит по наименьшему сопротивлению. т.е. когда подключается дисплей - то питание работает от VCC на GND (условно грубо) и дальше уходит на минус через 1К резистор.

2. когда дисплей отключается, то на GND дисплея от питания ничего не проходит и в этой линии появляется 5В которые уходят на сигнальный пин, потому что на этом проводе нет никаких помех. Поэтому мы видим сигнал HIGH на сигнальном пине.

Чего я не понимаю:

1. Почему, когда сигнальный провод просто заведен на 5В через 10К резистор - то сигнал HIGH  есть, а если подключить эту конструкцию к GND дисплея (которая подключена к минусу по 1К резистору), то сигнал HIGH пропадает. :о(

По идее по наименьшему сопротивлению сигнал с 5В должен идти на сигнальный провод и сигнальный пин, потому что на минус есть 1К резистор.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Забавно вы соединили 5В с GND :) Жалко дуньку. В общем, у вас неправильная схема, всё просто. Потому и не работает. Давайте ещё раз на словах, т.к. не за рабочим компом. Оперируем понятием "проводок" :)

1. Один проводок идёт к сигнальному пину ардуино, на котором мы проверяем факт подключения дисплея;

2. К этому проводку подсоединяются ДВА проводка;

3. Один из этих двух проводков - просто проводок, со свободным концом;

4. Ко второму проводку одним концом подключено сопротивление 10К, второй конец сопротивления подключен к 5В.

Это всё на стороне ардуины. Т.е. мы имеем один торчащий из неё проводок, при этом на пине ардуины всегда присутствует 5В, пока этот проводок никуда не подтыкнут. Если этот проводок ткнуть на GND - на пине ардуины появится 0В, если ткнуть на 5В - так и останется 5В, короче, принцип понятен.

Теперь на стороне платы дисплея:

1. Контакт, к которому подключается наш сигнальный проводок - напрямую замкнут на GND, т.е. напрямую подключён к GND своим, независимым от ардуины проводком;

2. Если соединить проводок сигнальной линии с этим контактом - то на пине будет появляться 0В, что будет значить событие "дисплей подключён".

Так понятней? Вы же, по сути, делаете коротыш, а не правильное подключение - "Линия 5В приходит на GND OLED дисплея через 10К резистор".

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

1. Один проводок идёт к сигнальному пину ардуино, на котором мы проверяем факт подключения дисплея;

2. К этому проводку подсоединяются ДВА проводка;

3. Один из этих двух проводков - просто проводок, со свободным концом;

4. Ко второму проводку одним концом подключено сопротивление 10К, второй конец сопротивления подключен к 5В.

Это всё на стороне ардуины. Т.е. мы имеем один торчащий из неё проводок, при этом на пине ардуины всегда присутствует 5В, пока этот проводок никуда не подтыкнут. Если этот проводок ткнуть на GND - на пине ардуины появится 0В, если ткнуть на 5В - так и останется 5В, короче, принцип понятен.

Теперь на стороне платы дисплея:

1. Контакт, к которому подключается наш сигнальный проводок - напрямую замкнут на GND, т.е. напрямую подключён к GND своим, независимым от ардуины проводком;

2. Если соединить проводок сигнальной линии с этим контактом - то на пине будет появляться 0В, что будет значить событие "дисплей подключён".

Так понятней? Вы же, по сути, делаете коротыш, а не правильное подключение - "Линия 5В приходит на GND OLED дисплея через 10К резистор".

Спасибо огромное за терпение!

не совсем понял как тогда подключать сигнальный провод ("второй свободный конец") к контакту GND дисплея?

Ведь если просто подоткнуть к линии GND(тот же общий минус), то это получается тот же "коротыш", т.е. на сигнальном пине будет ноль. У меня получается так и сделано. Надо както сигнальный пин подключать одновременно с дисплеем?

Вся мысль в том, чтобы дисплей можн обыло отключать и уносить - т.е. на плате остается GND + VDD + два провода данных.

Где в таком случае находится свободный конец провода - который идет от сигнального пина ардуины? У меня заведен на GND на плате, я уже понял что это высывает ноль на сигнальном пине. Но как же тогда подтыкать обратно дисплей - так чтобы он еще зацеплял сигнальный провод? делать чтото типа 5 ноги на дисплее(параллель GND ноги дисплея) - чтобы она подтыкалась в сигнальный провод?