Продолжаю героически пилить «Умный дом». На текущий момент сделано: вывод времени, даты, дня недели, погоды на сегодня и завтра, текущей температуры, включение/выключение дисплея по датчику движения.
Не удалось: подружить плату точного времени ds3231 работающую по шине i2C и Ethernet плату ENC28J60 работающую по шине SPI, Пошел какой-то конфликт между платами, разобраться как разрулить не смог. Пришлось время тоже брать с интернета.
Теоретически шина SPI на Arduino позволяет подключать к ней одновременно несколько устройств. Причем активным устройством на текущий момент, для работы скетча будет считаться то устройство, у которого низкий уровень сигнала на пине Cabel Select.
Например, подключаем два устройства к ардуине : SD картридер и сетевой интерфейс на микросхеме enc28j60, по следующей схеме:
Arduino Mega
enc28j60
SD
49 (SS, nCS, CS, CSB, CSN, nSS, STE)
CS
50 (SCLK, SCK, CLK)
SO
SPI_CLK
51 (MOSI, SDI, DI, SI)
SI
SPI_MOSI
52 (MISO, SDO, DO, SO)
SCK
SPI_MISO
53 (SS, nCS, CS, CSB, CSN, nSS, STE)
SD_CS
GND
GND
GND
5V
VCC
5V
Или может быть понятнее рисунок:
схема подключения по шине spi двух устройств: enc28j60 и sd реадер
Т.е. как мы видим, часть пинов используется совместно, но пины 49 и 53 выделены для управления, для того чтобы скетч и «железка» знали, какое именно устройство в данный момент может передавать данные по общим пинам. Если на управляющем пине низкий уровень напряжения, то скетч и железка считает, что может передавать данные именно та железка, которая подведена к данному пину. Например по моей схеме: если на 49 пине низкий уровень, а на 53 высокий, то работает сетевая карта. И наоборот.
На деле как оказалось конечному пользователю не нужно заморачиватся выставлением уровней на управляющих пинах…если конечно драйвера железок написаны правильно…
Например мой скетч по работе одновременно и с SD и с сетевой картой заработал с полпинка..
Два дня убил на подключение к Arduino Mega контроллера ENC28J60. Как всегда «дьявол кроется в деталях». Перепробовал кучу библиотек — не работает. Кто-то в интернетиках ляпнул, что библиотеки etherShield и ETHER_28J60 не работают с IDE 1.6.5. Сделал даунгрейд с IDE 1.6.5 на 1.0.5 — не работает. Переобжал кабель — не работает. Полез заказывать уже новый Ethernet shield… Но на по следок «дай думаю посажу его не на 3.3 вольта, как указано НА ВСЕХ схемах по подключению а на 5 вольт». Бьюсь головой об стену и глупо хихикаю.. Работает!
Итак, таки схема подключения в моем случае выглядит так:
Думал в выходные про будущую реализацию «Умного дома».. Делал некоторые наброски и т.п.. Стало шоком, что оказывается в Arduino не реализована «железячная» многопоточность т.е. выполнение нескольких подпрограмм одновременно. Реализовать некое подобие можно при помощи костылей «выполнение по таймеру» и прерываний.. Но всё не то.. Так-же есть несколько скетчей, написаных на ассемблере, которые расширяют стандартный вход main в программе, и делают «некий программный аналог» многопоточности. Ну ближе к делу посмотрим… Знать бы конечно сразу, так возможно бы остановился на Raspberry Pi..но цена там конечно более кусачая.