Официальный сайт компании Arduino по адресу arduino.cc
управление 8канальными модулями реле, через I2C 1602 PCF8574. для новогодней елки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Мож кому пригодится, чтоб не тратить время на разбирательства.
Задача , управление 6 модулей 8ми канальных реле , без ардуино меги2560, с наименьшими замутами по проводам. Гирлянды на большую елку очень большие, киловатные, поэтому ардуиновские модули твердотельные реле не выдержут. А на симисторах городить некогда , да и купить срочно в местных магазах симисторы будут гораздо дороже чем реле что были в наличии, и паять еще много надо.
Использовались распростаненные переходники (адаптеры ) I2C для дисплеев 1602 2004. Т.о. можно подключить 8..16.. модулей (в зависимости от наличия на переходниках микросхем с разным буквенным индексом PCF8574T 8адресов до 0x3F , PCF8574AT 8адресов до 0x27).
Модули I2C 1602 подходят - можно подпаять напрямую к модулям реле, подогнув ножки и там и там. Другие модули прямые не дисплейные, PCF8574 , дороже и небыло в наличии.
Переделка всего одна - перебросить пин:
для подключения друз за дружкой, припаять пины с низа:
из ардуин опробовано на digispark attiny85
скетч:
#include "PCF8574.h" #include <Wire.h> // у PCF8574T 8адресов до 0x3F // у PCF8574AT 8адресов до 0x27 // у других модификаций микросхем просканировать скетчем i2c scaner (в инете их полно всяких разных) // A0 A1 A2 PCF8574 M1(0x3F); // 1 1 1 (не запаяны) PCF8574 M2(0x3E); // 0 1 1 (запаяна перемычка слева) PCF8574 M3(0x3D); // 1 0 1 void setup() { // Serial.begin(9600); // Serial.println("\nTEST PCF8574\n"); M1.begin(); M2.begin(); M3.begin(); // прочтем что на входах , везде должны быть ло.1 на входах (протекает через оптопары в модулях реле) // uint8_t value = M1.read8(); // Serial.print("M1:\t"); // Serial.println(value); // M1.shiftLeft(); // сдвинуть // M1.shiftRight(); // сдвинуть // M1.write(i, 1); // записать бит // M2.write8(x); // записать сразу байт // M1.toggle(i); // инвертировать бит // выключим все реле , для наглядности в бинарном виде b........ . в hex 0x00 m1(B00000000); m2(B00000000); m3(B00000000); delay(1000); } // *********** ГЛАВНАЯ ПРОГРАММА **************** void loop() { // бегущий огонек: m1(B10000000); delay(1000); m1(B01000000); delay(1000); m1(B00100000); delay(1000); m1(B00010000); delay(1000); m1(B00001000); delay(1000); m1(B00000100); delay(1000); m1(B00000010); delay(1000); m1(B00000001); delay(1000); m1(B00000000); m2(B10000000); delay(1000); m2(B01000000); delay(1000); m2(B00100000); delay(1000); m2(B00010000); delay(1000); m2(B00001000); delay(1000); m2(B00000100); delay(1000); m2(B00000010); delay(1000); m2(B00000001); delay(1000); m2(B00000000); m3(B10000000); delay(1000); m3(B01000000); delay(1000); m3(B00100000); delay(1000); m3(B00010000); delay(1000); m3(B00001000); delay(1000); m3(B00000100); delay(1000); m3(B00000010); delay(1000); m3(B00000001); delay(1000); m3(B00000000); delay(1000); // из центра наружу в каждом модуле: m1(B00011000); m2(B00011000); m3(B00011000); delay(1000); m1(B00100100); m2(B00100100); m3(B00100100); delay(1000); m1(B01000010); m2(B01000010); m3(B01000010); delay(1000); m1(B10000001); m2(B10000001); m3(B10000001); delay(1000); m1(B00000000); m2(B00000000); m3(B00000000); delay(1000); // m1(B11111111); delay(2000); // 8 реле потребляют с digispark attiny85 ~0.6 Ампер while (1) {} // СТОП для теста } // ******* ФУНКЦИИ ******** void m1(byte x) { // отзеркалим байт для наглядности слева - направо http://arduino.ru/forum/programmirovanie/razvernut-bait-izmenenie-poryad... x = (x & 0x55) << 1 | (x & 0xAA) >> 1; x = (x & 0x33) << 2 | (x & 0xCC) >> 2; x = (x & 0x0F) << 4 | (x & 0xF0) >> 4; // инвертируем байт т.к. реле включается от лог.0 http://arduino.ru/forum/programmirovanie/kak-invertirovat-poluchennye-da... x=~x; // выведем в порт M1.write8(x); } void m2(byte x) { // отзеркалим байт для наглядности слева - направо x = (x & 0x55) << 1 | (x & 0xAA) >> 1; x = (x & 0x33) << 2 | (x & 0xCC) >> 2; x = (x & 0x0F) << 4 | (x & 0xF0) >> 4; // инвертируем байт т.к. реле включается от лог.0 x=~x; // выведем в порт M2.write8(x); } void m3(byte x) { // отзеркалим байт для наглядности слева - направо x = (x & 0x55) << 1 | (x & 0xAA) >> 1; x = (x & 0x33) << 2 | (x & 0xCC) >> 2; x = (x & 0x0F) << 4 | (x & 0xF0) >> 4; // инвертируем байт т.к. реле включается от лог.0 x=~x; // выведем в порт M3.write8(x); }
Какую библиотеку вы использовали? Как переключить пины на вход, а не только на выход?