Sterowanie urządzeniami w aucie.

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

Witam,

Od pewnego czasu zastanawiam się nad realizacją zdalnego sterowania urządzeniami w aucie, przy jednoczesnej kontroli stanu naładowania akumulatora, żeby nie skończyć z wyładowanym akumulatorem. Czy ktoś może mnie pokierować jak zbudować poniższy system.

Założenia:
1. W aucie mam WIFI poprzez modem GSM, bateria modemu trzyma około 10-12 godzin.
2. Nie używam akumulatora do ładowania/zasilania dodatkowych urządzeń w aucie jeśli napięcie podawane przez akumulator jest <xV - zabezpieczenie przed rozładowaniem.

Jak to ma działać:
1. Sprawdź stan akumulatora, jeżeli napięcie jest powyżej xV, przekaż informację do drugiego przekaźnika podpiętego do skrzynki z bezpiecznikami w środku auta, że można podawać zasilanie.
2. Jeżeli napięcie akumulatora spadnie poniżej wartości xV wyłącz przekaźnik w aucie.

Do tego przekaźnika w aucie chciałbym na początku podpiąć zasilanie modemu GSM, żeby od czasu do czasu doładowywać jego baterię oraz kamerę, która będzie monitorować auto w trybie parkingowym.
Ponieważ mam dodatkową grzałkę w aucie, auto ze Skandynawii, myślałem również o dodaniu Sonoffa z czujnikiem temperatury i jeżeli stan akumulatora na to pozwala i temperatura spadnie poniżej 5 stopni, to żeby się załączała na 15 min przed moim wyjściem do samochodu codziennie o określonej godzinie po moim potwierdzeniu.

Czy jest szansa aby coś takiego zrealizować na Supli. Będę wdzięczny za podpowiedzi.
Awatar użytkownika
wojtas567
Posty: 2209
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

Teoretycznie się da.
Sugerowałbym nie stosować sonoffa (nie ma wejścia analogowego) tylko np płytkę inCan i załatwisz to jednym modułem i nieporównywalnie stabilniejszy ESP
Napięcie wyświetlasz w temperaturze na inCanie jest już nawet wyjście analogowe i jest dzielnik napięcia ewentualnie trzeba zmienić rezystory dopasowując do napięcia i możesz funkcją termostatu włączać przekaźnik.
Drugi przekaźnik steruje nagrzewnicą z podpiętego DS lub nawet DHT22 i będziesz jeszcze wiedział jaką masz wilgotność w samochodzie :).
Pozdrawiam
Wojtek
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

ja podłączyłem w aucie na stale router mifi do zasilania przez przetwornice. 10h to krotko, raz nie odpalisz auta/doładujesz modemu i wszystko padnie. Poczałkowo miałem obawy czy mi to nie rozładuje akumulatora, ale nie rozładowało. Dodatkowo chodził cały czas 1 esp nodemcu.
Co do pomiaru napięcia to w tym roku mam zamiar go wstawić do auta. Kod do esp wykorzystałem z tematu o czujniku jakości powietrza. Po dodaniu 2 rezystorów na wejście ADC jako dzielnika napięcia działa na stole idealnie
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

dawidd pisze: czw wrz 13, 2018 4:23 am ja podłączyłem w aucie na stale router mifi do zasilania przez przetwornice. 10h to krotko, raz nie odpalisz auta/doładujesz modemu i wszystko padnie. Poczałkowo miałem obawy czy mi to nie rozładuje akumulatora, ale nie rozładowało. Dodatkowo chodził cały czas 1 esp nodemcu.
Co do pomiaru napięcia to w tym roku mam zamiar go wstawić do auta. Kod do esp wykorzystałem z tematu o czujniku jakości powietrza. Po dodaniu 2 rezystorów na wejście ADC jako dzielnika napięcia działa na stole idealnie
Hej mógłbyś się podzielić jakimś schematem, głębszym opisem jak to zrobiłeś?
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

A dokładnie o co pytasz? Podłączenie routera czy układu do pomiaru napięcia? Od jakiegoś czasu mam to już w aucie i wszystko gra. Na telefonie mam cały czas odczyt temperatury w aucie, napięcia akumulatora i możliwość włączenie webasta na 25min, plus czujnik czy webasto faktycznie wystartowało
Powiedz co potrzebujesz i postaram się odpowiedzieć
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

Potrzebuję układ do pomiaru napięcia na akamulatorze. Jak wykonać, ewentualnie jak coś pod to przerobić?

W tej chwili w aucie mam WIFI podpięte do power bank'a, który co jakiś czas ładuje się z akumulatora, więc WIFI jest dostępne cały czas, brakuje mi pomiaru napięcia na akumulatorze, żeby sprządź to z załączaniem grzałki.
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

tutaj masz kod ktory ja wykorzystuje do pomiaru napięcia akumulatora i sterowania webasto + temperatura w aucie i 1 czujnik NC. Kod jest na 2 ds'y ale działa tylko jeden do wyboru :) ewentualnie jak być zrezygnował z odczytu napięcia to wtedy 2 ds powinny działać
Ja wykorzystałem płytkę Yunshan,
Napięcie mierzysz na wejściu A0 poprzez dzielnik napięcia
tu jest fajny kalkulator
http://www.calculatoredge.com/electroni ... divide.htm

dzielnik dobierałem eksperymentalnie z rezystorów jakie miałem (najlepiej z tolerancja 1% lub mniej)
później trzeba w linijce
napiecie = odczytanaWartosc * (5.0/1024.0) * 4,3; //Przeliczenie wartości na napięcie
zmienić liczbę 4,3 tak żeby dopasować rzeczywiste napięcie jakie jest mierzone z tym co pokazuje supla

Na esp8266 można max 1V na A0 podać, stad potrzebny jest ten dzielnik. Jeśli użyjesz jakiegoś wemosa albo nodemcu to one maja już dzielnik, ale tylko do 3,3V - czyli tyle można podać na A0 wiec i tak dzielnik dodatkowy Ci potrzebny. A im więcej dzielników tym dokładność (i tak już kiepska) spadnie

Kod: Zaznacz cały

#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

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

int odczytanaWartosc = 0;//Odczytana wartość z ADC
float napiecie = 0;//Wartość przeliczona na napięcie w V

int measurePin = A0;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

// Setup a oneWire instance
OneWire oneWire_IN(02);// Deklaracja pinu 22 jako magistrala OneWire dla czujnika temperatury wewnętrznej
OneWire oneWire_OUT(12); // Deklaracja pinu 22 jako magistrala OneWire dla czujnika temperatury Zewnętrznej

// Pass oneWire reference to Dallas Temperature
// DallasTemperature sensors(&oneWire);
DallasTemperature sensors_IN(&oneWire_IN);
DallasTemperature sensors_OUT(&oneWire_OUT);

WiFiClient client;

const char* ssid     = "xxx";
const char* password = "xxx";

// filtrowanie danych z wejścia analogowego
int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}


// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    double tt=-275;
    
    DallasTemperature *sensor = NULL;
    
      
      switch(channelNumber) {
        case 0: {
                sensor = &sensors_IN;          
                tt=sensor->getTempCByIndex(0);
                Serial.print("Temperatura IN  : ");
                Serial.print(tt,1);
                Serial.println(" st C");
                break;
      }
        case 1:{
                sensor = &sensors_OUT;
                tt=sensor->getTempCByIndex(0);
                Serial.print("Temperatura OUT : ");
                Serial.print(tt,1);
                Serial.println(" st C");
                break;
        }
        case 2: {
//
                odczytanaWartosc = analogRead(A0); // odczytuję wartość na pinie analogowym  
//                odczytanaWartosc = Filter(odczytanaWartosc);
                napiecie = odczytanaWartosc * (5.0/1024.0) * 4,3; //Przeliczenie wartości na napięcie
                t=napiecie;
                Serial.print("Odczytana wartość z ADC (0-1023): ");
                Serial.print(odczytanaWartosc);
                Serial.print(",  -  zasilanie: ");
                Serial.print(napiecie);//Wysyłamy zmierzone napięcie
                Serial.println(" V");
                
                break;
        };
        
      }
      if ( sensor != NULL && sensor->getDeviceCount() > 0 )
      {
          sensor->requestTemperatures();
          t = sensor->getTempCByIndex(0);
      };

    return t;  
}


void setup() {
  Serial.begin(115200);
  WiFi.softAPdisconnect(true); // wyłączenie rozgłaszania sieci ESP

  // Init DS18B20 library 
  sensors_IN.begin();
  sensors_OUT.begin();
  // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
   
  // Replace the falowing GUID
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.macAddress(mac);
  char GUID[SUPLA_GUID_SIZE] = {0x20,0x18,0x10,0x04, 
                                        mac[WL_MAC_ADDR_LENGTH - 6], 
                                        mac[WL_MAC_ADDR_LENGTH - 5], 
                                        mac[WL_MAC_ADDR_LENGTH - 4], 
                                        mac[WL_MAC_ADDR_LENGTH - 3], 
                                        mac[WL_MAC_ADDR_LENGTH - 2], 
                                        mac[WL_MAC_ADDR_LENGTH - 1],
                                        0x31,0x12,0x34,0x56,0x78,0x90};

  // CHANNEL0,1,2
  SuplaDevice.addDS18B20Thermometer();  //DS in
  SuplaDevice.addDS18B20Thermometer();  //DS out
  SuplaDevice.addDS18B20Thermometer();  //napięcie

  // CHANNEL3,4,5,6
  SuplaDevice.addRelay(4, false);                 
  SuplaDevice.addRelay(13, true);              
  SuplaDevice.addRelay(14, true);
  SuplaDevice.addRelay(15, true); 
  
  // CHANNEL7,8 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(5);   // A0 - Pin number where the sensor is connected
  SuplaDevice.addSensorNO(16);  // Call SuplaDevice.addSensorNO(A0, true) with an extra "true" parameter
                                // to enable the internal pull-up resistor


  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr8.supla.org",  // SUPLA server address
                    xxxx,                 // tu wpisz swój Location ID 
                    "xxx");               // tu wpisz swoje Location Password
    
}

void loop() {
  
  if (WiFi.status() != WL_CONNECTED) // Jeżeli sieć WiFi nie jest podłączona, wywołaj procedurę łączenia
  {
    WiFi_up();
  }
  
  SuplaDevice.iterate();
  SuplaDevice.setTemperatureCallback(&get_temperature);
}


// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       WiFi_up();
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = &get_temperature;
           cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}

void WiFi_up() // Procedura podłączenia do sieci WiFi
{
  Serial.print("Proba podlaczenia do sieci ");
  Serial.println(ssid);

  WiFi.begin(ssid, password); // Próba podłączenia do sieci


  for (int x = 60; x > 0; x--) // Powtarzaj pętlę maksymanie maksymalnie 30 sekund (ponieważ przy każdym elsie jest 0,5 sekundy zwłoki)
  {
    if (WiFi.status() == WL_CONNECTED) // Jezeli WiFi jest podłączone
    {
      break;                           // to zatrzymaj pętlę
    }
    else                                 // w przeciwnym wypadku
    {
      Serial.print(".");               // wystaw na serial .
      delay(500);                      // i czekaj 0,5 sekundy
    }

  }

  if (WiFi.status() == WL_CONNECTED) // Jeżeli połączenie z siecią zostało nawiązane, wyślij na serial jego parametry
  {
    Serial.println("");
    Serial.println("Polaczenie nawiazane");
    Serial.println("Adres IP: ");
    Serial.print(WiFi.localIP());
    Serial.print(" / ");
    Serial.println(WiFi.subnetMask());
    Serial.print("Brama: ");
    Serial.println(WiFi.gatewayIP());
    long rssi = WiFi.RSSI();
    Serial.print("Sila sygnalu (RSSI): ");
    Serial.print(rssi);
    Serial.println(" dBm");
  }
  else    // w przeciwnym wypadku poinformuj przez serial o nieudanej próbie
  {
    Serial.println("");
    Serial.println("Polaczenia nie udalo sie nawiazac");
  }
}
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

Dzięki wielkie za kod. Zamówię sobie płytkę dzisiaj.

Niestety jestem trochę upośledzony w temacie elektroniki więc trzeba mi tłumaczyć jak idiocie. Mam kilka pytań:

1. Gdzie na płytce Yunshun jest wejście A0 bo nie mogę tego znaleźć na schematach?
2. Do czego wykorzystujesz czujnik NC i co to za czujnik?

Obrazek
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

https://www.google.pl/search?q=sp8266+1 ... CA2WkbHIRM:

tu masz opis pinow
A0 to ADC

Czujni NC to zwykle wejście w esp które wykorzystuje do webasto żeby w supli widzieć ze faktycznie ono wystartowało. Webasto jak to webasto - 3 nieudane próby odpalenia i sie blokuje. Z pieca wychodzi pin ktory na którym po odpaleniu pojawia sie 12V i to własnie wykorzystuje, żeby widzieć w supli ze piecyk odpalił. W zeszłym roku miałem kilka razy tak, ze w telefonie webasto było na ON a w aucie zimno
eradek
Posty: 81
Rejestracja: ndz wrz 09, 2018 5:32 pm

W końcu znalazłem czas żeby nad tym posiedzieć. Jeszcze raz dziękuję za kod i wskazówki, na stole wszystko działa jak należy, teraz czekam jeszcze na lepszy multimetr do kalibracji i można montować do auta, co prawda zima się kończy ale na następną się uwinę :). Dzięki!
ODPOWIEDZ

Wróć do „Pomysły i koncepcje”