Arduino Polska Forum

Pełna wersja: sterowanie przeaznikami
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam wszystkich mam problem z przerobieniem kodu do sterowania przekaźnikami , podany kod steruje przekaźnikami za pomocą pinów arduino mega 2560  czyli podaję masę na pin A1 arduino i np  załącza mi pierwszy przekaźnik kolejne podanie masy na ten pin wyłącza przekaźnik i taka sama funkcja dla kolejnych przekaźników przy większej ilości przekaźników braknie mi pinów i chcę to zrobić na ekspanderach PCF8574. Mam zrobione na początek dwie płytki na tych ekspanderach jedna będzie używana jako wejścia z przełączników a druga jako płytka z przekaźnikami , czy jest ktoś w stanie pomóc (może być odpłatnie) w napisaniu tego kodu na początek dla kilku przekaźników z dodaniem większej ilości przekaźników sobie poradzę

Kod:
// Enable debug prints to serial monitor
#define MY_DEBUG


// Enable and select radio type attached
//#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69

// Set LOW transmit power level as default, if you have an amplified NRF-module and
// power your radio separately with a good regulator you can turn up PA level.
//#define MY_RF24_PA_LEVEL RF24_PA_LOW

// Enable serial gateway
#define MY_GATEWAY_SERIAL

// Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
#if F_CPU == 8000000L
#define MY_BAUD_RATE 38400
#endif

// Flash leds on rx/tx/err
// #define MY_LEDS_BLINKING_FEATURE
// Set blinking period
// #define MY_DEFAULT_LED_BLINK_PERIOD 300

// Inverses the behavior of leds
// #define MY_WITH_LEDS_BLINKING_INVERSE

// Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway
#define MY_INCLUSION_BUTTON_FEATURE

// Inverses behavior of inclusion button (if using external pullup)
//#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP

// Set inclusion mode duration (in seconds)
#define MY_INCLUSION_MODE_DURATION 60
// Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN  3

// Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
//#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED

#include <SPI.h>
#include <MySensors.h>  
#include <Bounce2.h>

// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE


#define RELAY_1  4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define RELAY_2  5
#define RELAY_3  6
#define RELAY_4  7
#define NUMBER_OF_RELAYS 4 // Total number of attached relays
#define RELAY_ON 0  // GPIO value to write to turn on attached relay
#define RELAY_OFF 1 // GPIO value to write to turn off attached relay

#define BUTTON_PIN A1
#define BUTTON2_PIN A2
#define BUTTON3_PIN A3
#define BUTTON4_PIN A4

void before() {
 for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
   // Then set relay pins in output mode
   pinMode(pin, OUTPUT);  
   // Set relay to last known state (using eeprom storage)
   digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
 }
}
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

void setup() {
 // Setup locally attached sensors
 delay(10000);
  // Setup the button.
 pinMode(BUTTON_PIN, INPUT_PULLUP);
 pinMode(BUTTON2_PIN, INPUT_PULLUP);
 pinMode(BUTTON3_PIN, INPUT_PULLUP);
 pinMode(BUTTON4_PIN, INPUT_PULLUP);

 // After setting up the button, setup debouncer.
 debouncer.attach(BUTTON_PIN);
 debouncer.interval(5);
 debouncer2.attach(BUTTON2_PIN);
 debouncer2.interval(5);
 debouncer3.attach(BUTTON3_PIN);
 debouncer3.interval(5);
 debouncer4.attach(BUTTON4_PIN);
 debouncer4.interval(5);
 //presentation();
}
void presentation()  
{  
 // Send the sketch version information to the gateway and Controller
 sendSketchInfo("Relay", "1.0");

 for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
   // Register all sensors to gw (they will be created as child devices)
   present(sensor, S_LIGHT);
 }
}

MyMessage msg(1, V_LIGHT);
MyMessage msg2(2, V_LIGHT);
MyMessage msg3(3, V_LIGHT);
MyMessage msg4(4, V_LIGHT);

void loop() {
 // Send locally attached sensor data here
 if (debouncer.update()) {
   // Get the update value.
   int value = debouncer.read();
   // Send in the new value.
   if(value == LOW){
        saveState(1, !loadState(1));
        digitalWrite(RELAY_1, loadState(1)?RELAY_ON:RELAY_OFF);
        send(msg.set(loadState(1)));
        }
 }
 if (debouncer2.update()) {
     int value2 = debouncer2.read();
   if(value2 == LOW){
        saveState(2, !loadState(2));
        digitalWrite(RELAY_2, loadState(2)?RELAY_ON:RELAY_OFF);
        send(msg2.set(loadState(2)));
        }
 }
 if (debouncer3.update()) {
   int value3 = debouncer3.read();
   if(value3 == LOW){
        saveState(3, !loadState(3));
        digitalWrite(RELAY_3, loadState(3)?RELAY_ON:RELAY_OFF);
        send(msg3.set(loadState(3)));
        }
 }
 if (debouncer4.update()) {
   int value4 = debouncer4.read();
   if(value4 == LOW){
        saveState(4, !loadState(4));
        digitalWrite(RELAY_4, loadState(4)?RELAY_ON:RELAY_OFF);
        send(msg4.set(loadState(4)));
   }
 }
}

void receive(const MyMessage &message) {
 // We only expect one type of message from controller. But we better check anyway.
 if (message.type==V_LIGHT) {
    // Change relay state
    digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    saveState(message.sensor, message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.sensor);
    Serial.print(", New status: ");
    Serial.println(message.getBool());
 }
}
Kolego piszę z głowy zwykłe arduino ma 12 wyjść cyfrowych i 6 analogowych'
Wykorzystując 1 np A0 pod przyciski resztę czyli 17 masz na przekaźniki jak masz za mało to masz I2C

bullseye

(17-12-2017, 13:26)bob35 napisał(a): [ -> ]Kolego piszę z głowy zwykłe arduino ma 12 wyjść cyfrowych i 6 analogowych'
Wykorzystując 1 np A0 pod przyciski resztę czyli 17 masz na przekaźniki jak masz za mało to masz I2C
Kolega ma Arduino MEGA, wiec tam ma powyzej 50 wyjsc cyfrowych Smile
Docelowo będzie do sterowania około 40 przekaźników i 25 przełączników i dlatego chcę to zrobić na ekspanderach PCF8574 bo mam już gotowe takie płytki tylko nie wiem jak zacząć pisać program , na początek chodzi mi o uruchomienie dwóch płytek jedna jako ekspander z ośmioma wejściami a druga z ośmioma przekaźnikami
Kolego bullseye nie chciałem pisać że w tym przypadku Mega to wielkie G...o . Jak wyobrażasz sobie podłączyć tylko 50 przekaźników ? policz od arduino wychodzi 100 przewodów potem następne 100 zasilanie potem 100 lub 150 wyjścia ze styków . 50 Przekaźników obok siebie to 1m. Do tego projektu starczy kość jak attiny 13 tylko więcej pamięc lub arduino minii. No i projekt płytki.
Dlatego chcę podłączyć to wszystko do arduino przez magistrale I2C , będę miał 4płytki z ekspanderami ustawione jako wejściowe sygnały z przełączników oraz 4 płytki z przekaźnikami po 8 sztuk na każdej, ma to działać w następujący sposób : płytka z ekspanderem na adresie 0x20 ustawiona jako wejściowe sygnały z przycisków oraz na adresie 0x21 płytka z przekaźnikami i podaję sygnał z przycisku na pin A0 płytki wejściowej a na płytce z przekaźnikami włącza mi przekaźnik przypisany do pinu A0 chcę aby to wszystko działało tak jak w kodzie podanym wyżej tylko po magistrali I2c bez korzystania z pinów arduino
Jako wejścia wystarczą 32 oporniki 10k i 32 przyciski to wszystko podłączysz np do A0 a jako wyjścia do przekaźników jak napisałeś przez I2C. Tylko w tym przypadku można przyciskać jeden przycisk potem drugi itd. Jak chcesz kilka na raz to tak jak piszesz.
Będą w pomieszczeniach podwójne włączniki i może tak być że ktoś włączy dwa na raz dlatego wszystko muszę zrobić na szynie I2C , czy temat jest do ogarnięcia?
(18-12-2017, 19:32)bob35 napisał(a): [ -> ]Tu masz podpowiedź https://starter-kit.nettigo.pl/2011/11/p...w-arduino/


Witam w załączonym skeczu mam problem ze stanem przekaźnika w domoticzu jak go włączę to w domoticzu ikona jest że wyłączony i na odwrót ktoś coś poradzi?