Stránka 2 z 3

Re: Automatický přepínač světel do auta

Napsal: 15 kvě 2020, 20:32
od vojta_1
Zdravím, automat jsem trochu vylepšil o voltmetr a měření teploty, ty to dvě veličiny se objevují na jednom řádku, ale má to jeden háček překrývají se.
Záměr byl takový, aby se teplota objevila na 2 min a pak by se objevil voltmetr na 1 min a tak by se to měnilo ve smyčce a tu je ten problém s kterým bych potřeboval pomoc, najde se někdo….., Díky

Kód: Vybrat vše

/**************************************************************************
 Zapojení:           pin:
 Arduino nano
 Oled 0.96 i2c       SDA-A4
                     SCL-A5
 RST                 4
 DS1307              SDA-A4
                     SCK-A5
 LDR                 A0 (modul)
 Vystup pro rele     A1,A2 (modul)                                           
 2x tlačitko         9,8 nastavení hodin
 DS18B20             5
voltmetr             A3   
R1                   100K
R2                   10K

Porovnání s vaším laboratorním DVM neshodoval, použijte přesný DMM k nalezení 
skutečného odporu R1 a R2, a nahraďte R1 = 100000,0 a R2 = 10000,0 v kódu těmito 
hodnotami. Dále zkontrolujte napájení 5V s laboratorním DVM na GND a 5V piny na desce 
Arduino. Mohlo by vám poskytnout méně (například 4,95 V), nahradit hodnotu do 
kódu vout = (hodnota * 5,0) / 1024,0 (tj. Nahradit hodnotu 5,0 skutečnému 
čtení V, v tomto případě 4,95 V). Dále se vždy snažte použít přesné 1% toleranční 
rezistory pro R1 a R2.
 **************************************************************************/
#include <Wire.h>                        
#include <SPI.h>
#include <Adafruit_GFX.h>                
#include <Adafruit_SSD1306.h>            
#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS 5
#define OLED_RESET 4
#define SSD1306_LCDHEIGHT 64

Adafruit_SSD1306 display(OLED_RESET);
 
#define button1    9                       // Tlačítko 
#define button2    8                       // Tlačítko 

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire); 

int analogInput = A3;

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// 'auto Logo', 128x64px
  const unsigned char myBitmap [] PROGMEM = {
  0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0xC1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8A,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x8B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x03,0x44,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0xE4,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x02,0xF4,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x03,0x56,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x3F,0xF8,0x00,0x03,0x53,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x07,0xE0,0x0F,0xC0,0x02,0x61,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x40,0x0C,0x00,0x00,0x78,0x02,0xE1,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x40,0x18,0x00,0x00,0x0F,0xFE,0xC6,0x0D,0xF8,0x00,0x00,0x0F,0x80,0x00,0x00,0x00, 
  0x60,0x10,0x00,0x00,0x00,0x0F,0x98,0x18,0xF4,0x07,0xFF,0xF8,0xE0,0x00,0x00,0x00, 
  0x70,0x20,0x00,0x00,0x03,0xF9,0x18,0x28,0x1E,0x1C,0x00,0x00,0x18,0x00,0x00,0x00, 
  0x78,0x47,0x8F,0x00,0xDE,0xC5,0x8F,0x08,0x1E,0x30,0x00,0x00,0x0C,0x00,0x00,0x00, 
  0x48,0xDF,0x8F,0x0F,0xD9,0x81,0x03,0x08,0x0F,0x30,0xFB,0xFF,0x06,0x00,0x00,0x00, 
  0x48,0x9F,0x8F,0x97,0xAD,0x03,0x00,0x08,0x0F,0x33,0xF8,0xFF,0xC3,0x00,0x00,0x00, 
  0x79,0xBF,0x8F,0x9F,0xAF,0x81,0x80,0x08,0x0F,0x67,0xF8,0xFF,0xF9,0x80,0x00,0x00, 
  0x01,0x3F,0x8F,0xCF,0xA7,0x41,0x00,0x08,0x07,0x6F,0xF8,0xFF,0xFC,0xC0,0x00,0x00, 
  0x3F,0x7F,0x8F,0xC7,0xA7,0xB9,0x00,0x00,0x07,0xFF,0xF8,0xFF,0xFE,0x60,0x00,0x00, 
  0x10,0x3F,0x8F,0xE3,0x9B,0xB1,0xFC,0x7F,0x7F,0xDF,0xF8,0xFF,0xFF,0x30,0x00,0x00, 
  0x10,0x00,0x87,0xE1,0x8F,0xC1,0x02,0x5F,0xFF,0x9F,0xF8,0xFF,0xFF,0x18,0x00,0x00, 
  0x10,0x00,0x07,0xE1,0x83,0xB0,0x06,0x60,0x07,0x3F,0xF8,0xFF,0xFF,0x8F,0xFC,0x00, 
  0x10,0x00,0x03,0xC0,0x03,0xFC,0x0B,0xE0,0x16,0xFF,0xF8,0xFF,0xFF,0x80,0x3F,0x00, 
  0x30,0xFC,0x00,0x00,0x00,0x1F,0x0B,0x7F,0xFC,0x80,0xF8,0x00,0x1F,0x80,0x0D,0x80, 
  0x21,0xF4,0x00,0x00,0x00,0xFE,0x8B,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0xFF,0x80, 
  0x23,0x74,0x00,0x00,0x01,0x8F,0x0B,0xBF,0x81,0xF0,0x00,0x00,0x00,0x00,0x7F,0x40, 
  0x23,0xFC,0x00,0x00,0x01,0x1F,0x0E,0x07,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x60, 
  0x27,0xFC,0x00,0x00,0x01,0xBF,0x06,0x00,0xE0,0x07,0xFF,0xFF,0xE0,0x01,0xBF,0xF0, 
  0x26,0x3C,0x00,0x00,0x00,0xE0,0x7E,0x03,0xC0,0x01,0x80,0x00,0xC0,0x00,0xC0,0x10, 
  0x3E,0x1E,0x00,0x00,0x00,0x7F,0xDA,0x07,0x1F,0x00,0xC0,0x01,0x80,0x00,0x60,0x10, 
  0x3E,0x1E,0x00,0x00,0x00,0x7F,0xDA,0x07,0x1F,0x00,0xC0,0x01,0x80,0x00,0x60,0x10, 
  0x06,0x0F,0x00,0xFC,0x00,0xC0,0x3E,0x1E,0x31,0xF0,0x40,0x03,0x1F,0xC0,0x60,0x10, 
  0x05,0x0F,0x01,0x66,0x00,0x80,0xCC,0x1C,0x7F,0xF8,0x60,0x02,0x31,0xF0,0x20,0x10,
  0x05,0x87,0x82,0xDF,0x01,0x81,0x8F,0x88,0x5F,0xFC,0x00,0x04,0x7F,0xFC,0x30,0x10, 
  0x06,0xEF,0xC3,0xB5,0x81,0x0E,0x7F,0x80,0xFC,0x7E,0x00,0x04,0x5F,0xF7,0x80,0x10, 
  0x03,0x3F,0xFF,0xC6,0xC1,0xF0,0x60,0x80,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x80,0x10, 
  0x03,0xFF,0x87,0xC2,0xC0,0x00,0x20,0x8F,0x70,0x1F,0x00,0x01,0xF8,0x1F,0x80,0x10, 
  0x03,0xFF,0x87,0xC2,0xC0,0xE0,0x20,0xFF,0x60,0x1F,0x00,0x03,0x70,0x0B,0x80,0x30, 
  0x01,0xFF,0x07,0xC6,0xE1,0x80,0xFE,0x7F,0x70,0x1F,0x8F,0xFF,0xD0,0x0B,0x80,0x60, 
  0x00,0x7E,0x07,0xDD,0x61,0x07,0x60,0x0E,0x70,0x17,0xFF,0xFF,0xD8,0x1F,0xC0,0x40, 
  0x00,0x00,0x07,0xF3,0xFF,0xFF,0x80,0x00,0x78,0x1F,0x80,0x00,0x58,0x37,0xFF,0xC0, 
  0x00,0x00,0x07,0xFE,0xC1,0xFC,0x00,0x00,0x7F,0xFF,0x00,0x00,0x58,0x6F,0x80,0x00, 
  0x00,0x00,0x07,0xC7,0x80,0x00,0x00,0x00,0x7F,0xFF,0x00,0x00,0x7F,0xFE,0x80,0x00, 
  0x00,0x00,0x03,0xFF,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x00,0x6F,0xFD,0x00,0x00, 
  0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xFB,0x00,0x00  
};

void setup(void) {

  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
  display.drawBitmap(0, 0, myBitmap, 128, 64, WHITE);
  display.display();
  delay(3500); 
 
  pinMode(A0,INPUT);               //Analog A2 in LDR Pin
  pinMode(A1,OUTPUT);              //Světla On/Off Pin - potkavací
  pinMode(A2,OUTPUT);              //Světla On/Off Pin - tlumená

  pinMode(analogInput, INPUT);
  
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  delay(1000);
  
  display.clearDisplay();
  display.display();

  sensors.begin(); 
}

char Time[]     = "  :  :  ";
byte i, second, minute, hour;
 
void DS1307_display(){
// Convert BCD to decimal
  second = (second >> 4) * 10 + (second & 0x0F);
  minute = (minute >> 4) * 10 + (minute & 0x0F);
  hour   = (hour >> 4)   * 10 + (hour & 0x0F);

  Time[7]     = second % 10 + 48;
  Time[6]     = second / 10 + 48;
  Time[4]     = minute % 10 + 48;
  Time[3]     = minute / 10 + 48;
  Time[1]     = hour   % 10 + 48;
  Time[0]     = hour   / 10 + 48;

  draw_text(16, 5, Time, 2);
}
 
void blink_parameter(){
  byte j = 0;
  while(j < 10 && digitalRead(button1) && digitalRead(button2)){
    j++;
    delay(25);
  }
}
 
byte edit(byte x_pos, byte y_pos, byte parameter){
  char text[3];
  sprintf(text,"%02u", parameter);
  while(!digitalRead(button1));                      // Počkejte, až uvolníte tlačítko B1
  while(true){
    while(!digitalRead(button2)){                    // Pokud je stisknuto tlačítko B2
      parameter++;
      if(i == 3 && parameter > 23)                   // Pokud jsou hodiny> 23 ==> hodiny = 0
        parameter = 0;
      if(i == 4 && parameter > 59)                   // Pokud minuty> 59 ==> minuty = 0
        parameter = 0;
      sprintf(text,"%02u", parameter);
      draw_text(x_pos, y_pos, text, 2);
      delay(200);                                    // Počkejte 200ms
    }
    draw_text(x_pos, y_pos, "  ", 2);
    blink_parameter();
    draw_text(x_pos, y_pos, text, 2);
    blink_parameter();
    if(!digitalRead(button1)){                       // Pokud je stisknuto tlačítko B1
      i++;                                           // Přírůstek „in“ pro další parametr
      return parameter;                              // Vraťte hodnotu parametru a ukončete
    }
  }
}
 
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(text);
  display.display();
}

void loop () {

  display.drawLine(0, 0, 127, 0, WHITE);
  display.drawLine(0, 23, 127, 23, WHITE);
  display.drawLine(127, 0, 127, 63, WHITE);
  display.drawLine(127, 63, 0, 63, WHITE);
  display.drawLine(0, 63, 0, 0, WHITE);
  
  //display.setTextSize(2);               //vrchní řádek
  //display.setTextColor(WHITE);
  //display.setCursor(3, 26); 
  //display.println("[");
  display.setTextSize(2);                //spodní řádek
  display.setTextColor(WHITE);        
  display.setCursor(3, 46); 
  display.println("[");
  //display.setTextSize(2);              //vrchní řádek
  //display.setTextColor(WHITE);
  //display.setCursor(113, 26); 
  //display.println("]");
  display.setTextSize(2);               //spodní řádek
  display.setTextColor(WHITE);
  display.setCursor(113, 46); 
  display.println("]");
  
     if(!digitalRead(button1)){                   // Pokud je stisknuto tlačítko B1
     i = 0;
     while(!digitalRead(button1));                // Počkejte na uvolnění tlačítka B1
     while(true){
     while(!digitalRead(button2)){                // Při stisknutém tlačítku B2
     delay(200);                                  // Wait 200 ms
     }
     if(!digitalRead(button1))                    // Pokud je stisknuto tlačítko B1
     blink_parameter();                           // Bliká dané číslo
     display.setTextColor(WHITE, BLACK);             
       break;
   }
   hour   = edit(16, 5, hour);                     // Upravit hodiny
   minute = edit(52, 5, minute);                   // Upravit minuty 
   
// Convert decimal to BCD
   minute = ((minute / 10) << 4) + (minute % 10);
   hour = ((hour / 10) << 4) + (hour % 10);
   
// Write data to DS1307 RTC
    Wire.beginTransmission(0x68);               // Start I2C protokol s adresou DS1307
    Wire.write(0);                              // Adresa odeslat registr
    Wire.write(0);                              // Resetujte sekundy a spusťte oscilátor
    Wire.write(minute);                         // Napiše minutu
    Wire.write(hour);                           // Napiše hodinu
    Wire.endTransmission();                     // Zastavení přenosu a uvolnění I2C sběrnici
    delay(200);                                 // Počkejte 200ms
   }
 
  Wire.beginTransmission(0x68);                 // Start I2C protokol s adresou DS1307
  Wire.write(0);                                // Odeslat registrační adresu
  Wire.endTransmission(false);                  // I2C restart
  Wire.requestFrom(0x68, 7);                    // Vyžáda si 7 bajtů od DS1307 a uvolněte I2C sběrnici na konci čtení
  second = Wire.read();                         // Čtení sekund z registru 0
  minute = Wire.read();                         // Přečtěte si zápis z registru 1
  hour   = Wire.read();                         // Přečíst hodinu z registru 2

  DS1307_display();                             // Zobrazit čas
 
  delay(50);                                    // Počkejte 50ms
 
//Head Light On/Off
 int digital=analogRead(A0);                   // LDR in
     display.println(digital);
     if(digital>=700){
     digitalWrite(A1,LOW);                     // Zapne světla - potkavací
     display.clearDisplay();
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setCursor(17, 27); 
     display.println("Z.Svetla");
     digitalWrite(A2,LOW);                    //  Zapne světla - tlumená
     delay(100);
     }
      else {
     digitalWrite(A1,HIGH);                  // Vypne světla - potkavací
     display.clearDisplay();
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setCursor(13, 27);
     display.println("D.Sviceni");
     digitalWrite(A2,HIGH);                //  Vypne světla - tlumená
     delay(100);
}
      
// DS18B20
  float temp;
 
    sensors.requestTemperatures(); 
    temp = sensors.getTempCByIndex(0);
 
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(25,46);
    display.println(temp);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(93, 46); 
    display.println("C");
    delay(1000);         

// voltmetr    
   float vout = 0.0;
   float vin = 0.0;
   float R1 = 100000.0;     // odpor R1 (100K)
   float R2 = 10000.0 ;     // odpor R1 (10K)
   int value = 0;
  
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  vin = vout / (R2 / (R1 + R2));
  if (vin<0.09) {
  vin=0.0;
 }
   
   Serial.print("INPUT Voltage= ");
   Serial.println(vin, 2);
   display.setTextSize(2);
   display.setCursor(25, 46);
   display.println(vin, 2);
   display.setCursor(93, 46);
   display.println("V");
   delay(500);
  
} 

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 11:00
od kiRRow
Nevím co tam máš za displej a jak se ovládá ... ale všimni si že v jiných výpisech se displej vždy smaže příkazem display.clearDisplay(); ... ten ti u temp a volt chybí.

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 13:08
od vojta_1
Zdravím problem nemužu kompilovat žadny soubor,jediny který kompiluji je Blik u zbytku mi piše exit status 1,použivám IDE 1.8 win 10,jdu studovat na netu.....

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 14:08
od kiRRow
... já pak většinou zjistím, že mám blbě navolenou vývojovou desku z jiného projektu :D

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 14:21
od vojta_1
Tak jsem celé IDE přeinstaloval nahral znova knihovny a je to pořád stejne ,divné že kody s knihovnou U8glib nahraju a sknihovnou Adafruit_GFX ne ,desky stím nemaji nic společné mam UNO a nano a chová se to stejně prostě nejde to kompilovat ať tam deska je nebo není.

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 14:28
od vojta_1
Tak už to jede ,chyba byla v jedne knihovně Adafruit_I2CDevice.h......

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 16:37
od Hafajs
kiRRow píše:
16 kvě 2020, 11:00
Nevím co tam máš za displej a jak se ovládá ... ale všimni si že v jiných výpisech se displej vždy smaže příkazem display.clearDisplay(); ... ten ti u temp a volt chybí.
Přesně, před kreslením nových hodnot, smaž display. Jinak nebude tak malé zobrazovalo rozptylovat pilota při řízení? Možná by to chtělo buď větší, třeba barevný a víc grafiky (jen vločka při námraze...) To jen jako nápad. A nebo velkou lupu ;)

Re: Automatický přepínač světel do auta

Napsal: 16 kvě 2020, 16:51
od vojta_1
Voltmetr tam nebude necham tam teploměr, ten kod jede dobře,chtěl jsem to dát do Fabie1 do budíku uprostřed pod kontrolkama je místo a nebo to předělám na 5110 lcd .. :D

Kód: Vybrat vše

/**************************************************************************
 Zapojení:           pin:
 Arduino nano
 Oled 0.96 i2c       SDA-A4
                     SCL-A5
 RST                 4
 DS1307              SDA-A4
                     SCK-A5
 LDR                 A0 (modul)
 Vystup pro rele     A1,A2 (modul)                                           
 2x tlačitko         9,8 nastavení hodin
 DS18B20             5

 **************************************************************************/
#include <Wire.h>                        
#include <SPI.h>
#include <Adafruit_GFX.h>                
#include <Adafruit_SSD1306.h>            
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 5
#define OLED_RESET 4
#define SSD1306_LCDHEIGHT 64

Adafruit_SSD1306 display(OLED_RESET);
 
#define button1    9                       // Tlačítko 
#define button2    8                       // Tlačítko 

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire); 

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// 'auto Logo', 128x64px
  const unsigned char myBitmap [] PROGMEM = {
  0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0xC1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8A,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x8B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x03,0x44,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x01,0xE4,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x02,0xF4,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x03,0x56,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x3F,0xF8,0x00,0x03,0x53,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x07,0xE0,0x0F,0xC0,0x02,0x61,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x40,0x0C,0x00,0x00,0x78,0x02,0xE1,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x40,0x18,0x00,0x00,0x0F,0xFE,0xC6,0x0D,0xF8,0x00,0x00,0x0F,0x80,0x00,0x00,0x00, 
  0x60,0x10,0x00,0x00,0x00,0x0F,0x98,0x18,0xF4,0x07,0xFF,0xF8,0xE0,0x00,0x00,0x00, 
  0x70,0x20,0x00,0x00,0x03,0xF9,0x18,0x28,0x1E,0x1C,0x00,0x00,0x18,0x00,0x00,0x00, 
  0x78,0x47,0x8F,0x00,0xDE,0xC5,0x8F,0x08,0x1E,0x30,0x00,0x00,0x0C,0x00,0x00,0x00, 
  0x48,0xDF,0x8F,0x0F,0xD9,0x81,0x03,0x08,0x0F,0x30,0xFB,0xFF,0x06,0x00,0x00,0x00, 
  0x48,0x9F,0x8F,0x97,0xAD,0x03,0x00,0x08,0x0F,0x33,0xF8,0xFF,0xC3,0x00,0x00,0x00, 
  0x79,0xBF,0x8F,0x9F,0xAF,0x81,0x80,0x08,0x0F,0x67,0xF8,0xFF,0xF9,0x80,0x00,0x00, 
  0x01,0x3F,0x8F,0xCF,0xA7,0x41,0x00,0x08,0x07,0x6F,0xF8,0xFF,0xFC,0xC0,0x00,0x00, 
  0x3F,0x7F,0x8F,0xC7,0xA7,0xB9,0x00,0x00,0x07,0xFF,0xF8,0xFF,0xFE,0x60,0x00,0x00, 
  0x10,0x3F,0x8F,0xE3,0x9B,0xB1,0xFC,0x7F,0x7F,0xDF,0xF8,0xFF,0xFF,0x30,0x00,0x00, 
  0x10,0x00,0x87,0xE1,0x8F,0xC1,0x02,0x5F,0xFF,0x9F,0xF8,0xFF,0xFF,0x18,0x00,0x00, 
  0x10,0x00,0x07,0xE1,0x83,0xB0,0x06,0x60,0x07,0x3F,0xF8,0xFF,0xFF,0x8F,0xFC,0x00, 
  0x10,0x00,0x03,0xC0,0x03,0xFC,0x0B,0xE0,0x16,0xFF,0xF8,0xFF,0xFF,0x80,0x3F,0x00, 
  0x30,0xFC,0x00,0x00,0x00,0x1F,0x0B,0x7F,0xFC,0x80,0xF8,0x00,0x1F,0x80,0x0D,0x80, 
  0x21,0xF4,0x00,0x00,0x00,0xFE,0x8B,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0xFF,0x80, 
  0x23,0x74,0x00,0x00,0x01,0x8F,0x0B,0xBF,0x81,0xF0,0x00,0x00,0x00,0x00,0x7F,0x40, 
  0x23,0xFC,0x00,0x00,0x01,0x1F,0x0E,0x07,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x60, 
  0x27,0xFC,0x00,0x00,0x01,0xBF,0x06,0x00,0xE0,0x07,0xFF,0xFF,0xE0,0x01,0xBF,0xF0, 
  0x26,0x3C,0x00,0x00,0x00,0xE0,0x7E,0x03,0xC0,0x01,0x80,0x00,0xC0,0x00,0xC0,0x10, 
  0x3E,0x1E,0x00,0x00,0x00,0x7F,0xDA,0x07,0x1F,0x00,0xC0,0x01,0x80,0x00,0x60,0x10, 
  0x3E,0x1E,0x00,0x00,0x00,0x7F,0xDA,0x07,0x1F,0x00,0xC0,0x01,0x80,0x00,0x60,0x10, 
  0x06,0x0F,0x00,0xFC,0x00,0xC0,0x3E,0x1E,0x31,0xF0,0x40,0x03,0x1F,0xC0,0x60,0x10, 
  0x05,0x0F,0x01,0x66,0x00,0x80,0xCC,0x1C,0x7F,0xF8,0x60,0x02,0x31,0xF0,0x20,0x10,
  0x05,0x87,0x82,0xDF,0x01,0x81,0x8F,0x88,0x5F,0xFC,0x00,0x04,0x7F,0xFC,0x30,0x10, 
  0x06,0xEF,0xC3,0xB5,0x81,0x0E,0x7F,0x80,0xFC,0x7E,0x00,0x04,0x5F,0xF7,0x80,0x10, 
  0x03,0x3F,0xFF,0xC6,0xC1,0xF0,0x60,0x80,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x80,0x10, 
  0x03,0xFF,0x87,0xC2,0xC0,0x00,0x20,0x8F,0x70,0x1F,0x00,0x01,0xF8,0x1F,0x80,0x10, 
  0x03,0xFF,0x87,0xC2,0xC0,0xE0,0x20,0xFF,0x60,0x1F,0x00,0x03,0x70,0x0B,0x80,0x30, 
  0x01,0xFF,0x07,0xC6,0xE1,0x80,0xFE,0x7F,0x70,0x1F,0x8F,0xFF,0xD0,0x0B,0x80,0x60, 
  0x00,0x7E,0x07,0xDD,0x61,0x07,0x60,0x0E,0x70,0x17,0xFF,0xFF,0xD8,0x1F,0xC0,0x40, 
  0x00,0x00,0x07,0xF3,0xFF,0xFF,0x80,0x00,0x78,0x1F,0x80,0x00,0x58,0x37,0xFF,0xC0, 
  0x00,0x00,0x07,0xFE,0xC1,0xFC,0x00,0x00,0x7F,0xFF,0x00,0x00,0x58,0x6F,0x80,0x00, 
  0x00,0x00,0x07,0xC7,0x80,0x00,0x00,0x00,0x7F,0xFF,0x00,0x00,0x7F,0xFE,0x80,0x00, 
  0x00,0x00,0x03,0xFF,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x00,0x6F,0xFD,0x00,0x00, 
  0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xFB,0x00,0x00  
};

void setup(void) {

  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
  display.drawBitmap(0, 0, myBitmap, 128, 64, WHITE);
  display.display();
  delay(3500); 
 
  pinMode(A0,INPUT);               //Analog A2 in LDR Pin
  pinMode(A1,OUTPUT);              //Světla On/Off Pin - potkavací
  pinMode(A2,OUTPUT);              //Světla On/Off Pin - tlumená

  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  delay(1000);
  
  display.clearDisplay();
  display.display();

  sensors.begin(); 
}

char Time[]     = "  :  :  ";
byte i, second, minute, hour;
 
void DS1307_display(){
// Convert BCD to decimal
  second = (second >> 4) * 10 + (second & 0x0F);
  minute = (minute >> 4) * 10 + (minute & 0x0F);
  hour   = (hour >> 4)   * 10 + (hour & 0x0F);

  Time[7]     = second % 10 + 48;
  Time[6]     = second / 10 + 48;
  Time[4]     = minute % 10 + 48;
  Time[3]     = minute / 10 + 48;
  Time[1]     = hour   % 10 + 48;
  Time[0]     = hour   / 10 + 48;

  draw_text(16, 5, Time, 2);
}
 
void blink_parameter(){
  byte j = 0;
  while(j < 10 && digitalRead(button1) && digitalRead(button2)){
    j++;
    delay(25);
  }
}
 
byte edit(byte x_pos, byte y_pos, byte parameter){
  char text[3];
  sprintf(text,"%02u", parameter);
  while(!digitalRead(button1));                      // Počkejte, až uvolníte tlačítko B1
  while(true){
    while(!digitalRead(button2)){                    // Pokud je stisknuto tlačítko B2
      parameter++;
      if(i == 3 && parameter > 23)                   // Pokud jsou hodiny> 23 ==> hodiny = 0
        parameter = 0;
      if(i == 4 && parameter > 59)                   // Pokud minuty> 59 ==> minuty = 0
        parameter = 0;
      sprintf(text,"%02u", parameter);
      draw_text(x_pos, y_pos, text, 2);
      delay(200);                                    // Počkejte 200ms
    }
    draw_text(x_pos, y_pos, "  ", 2);
    blink_parameter();
    draw_text(x_pos, y_pos, text, 2);
    blink_parameter();
    if(!digitalRead(button1)){                       // Pokud je stisknuto tlačítko B1
      i++;                                           // Přírůstek „in“ pro další parametr
      return parameter;                              // Vraťte hodnotu parametru a ukončete
    }
  }
}
 
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(text);
  display.display();
}

void loop () 
{
  display.drawLine(0, 0, 127, 0, WHITE);
  display.drawLine(0, 23, 127, 23, WHITE);
  display.drawLine(127, 0, 127, 63, WHITE);
  display.drawLine(127, 63, 0, 63, WHITE);
  display.drawLine(0, 63, 0, 0, WHITE);
  
  //display.setTextSize(2);               //vrchní řádek
  //display.setTextColor(WHITE);
  //display.setCursor(3, 26); 
  //display.println("[");
  display.setTextSize(2);                //spodní řádek
  display.setTextColor(WHITE);        
  display.setCursor(3, 46); 
  display.println("[");
  //display.setTextSize(2);              //vrchní řádek
  //display.setTextColor(WHITE);
  //display.setCursor(113, 26); 
  //display.println("]");
  display.setTextSize(2);               //spodní řádek
  display.setTextColor(WHITE);
  display.setCursor(113, 46); 
  display.println("]");
  
     if(!digitalRead(button1)){                   // Pokud je stisknuto tlačítko B1
     i = 0;
     while(!digitalRead(button1));                // Počkejte na uvolnění tlačítka B1
     while(true){
     while(!digitalRead(button2)){                // Při stisknutém tlačítku B2
     delay(200);                                  // Wait 200 ms
     }
     if(!digitalRead(button1))                    // Pokud je stisknuto tlačítko B1
     blink_parameter();                           // Bliká dané číslo
     display.setTextColor(WHITE, BLACK);             
       break;
   }
   hour   = edit(16, 5, hour);                     // Upravit hodiny
   minute = edit(52, 5, minute);                   // Upravit minuty 
   
// Convert decimal to BCD
   minute = ((minute / 10) << 4) + (minute % 10);
   hour = ((hour / 10) << 4) + (hour % 10);
   
// Write data to DS1307 RTC
    Wire.beginTransmission(0x68);               // Start I2C protokol s adresou DS1307
    Wire.write(0);                              // Adresa odeslat registr
    Wire.write(0);                              // Resetujte sekundy a spusťte oscilátor
    Wire.write(minute);                         // Napiše minutu
    Wire.write(hour);                           // Napiše hodinu
    Wire.endTransmission();                     // Zastavení přenosu a uvolnění I2C sběrnici
    delay(200);                                 // Počkejte 200ms
   }
 
  Wire.beginTransmission(0x68);                 // Start I2C protokol s adresou DS1307
  Wire.write(0);                                // Odeslat registrační adresu
  Wire.endTransmission(false);                  // I2C restart
  Wire.requestFrom(0x68, 7);                    // Vyžáda si 7 bajtů od DS1307 a uvolněte I2C sběrnici na konci čtení
  second = Wire.read();                         // Čtení sekund z registru 0
  minute = Wire.read();                         // Přečtěte si zápis z registru 1
  hour   = Wire.read();                         // Přečíst hodinu z registru 2

  DS1307_display();                             // Zobrazit čas
 
  delay(50);                                    // Počkejte 50ms
 
//Head Light On/Off
 int digital=analogRead(A0);                   // LDR in
     display.println(digital);
     if(digital>=700){
     digitalWrite(A1,LOW);                     // Zapne světla - potkavací
     display.clearDisplay();
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setCursor(17, 27); 
     display.println("Z.Svetla");
     digitalWrite(A2,LOW);                    //  Zapne světla - tlumená
     delay(100);
     }
      else {
     digitalWrite(A1,HIGH);                  // Vypne světla - potkavací
     display.clearDisplay();
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setCursor(13, 27);
     display.println("D.Sviceni");
     digitalWrite(A2,HIGH);                //  Vypne světla - tlumená
     delay(100);
}
      
// DS18B20
  float temp;
 
    sensors.requestTemperatures(); 
    temp = sensors.getTempCByIndex(0);
 
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(25,46);
    display.println(temp);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(93, 46); 
    display.println("C");
    delay(1000);         
} 

Re: Automatický přepínač světel do auta

Napsal: 17 kvě 2020, 12:18
od Hafajs
Já totiž jezdil s vejskomerem na stejném zobrazovači a nic moc ;)

Re: Automatický přepínač světel do auta

Napsal: 07 zář 2021, 22:58
od vojta_1
Zdravím, přidávám další kód pro automatické ovládaní světlometu v autě.

Kód se liší v tom, že za pomocí 2 tlačítek můžete nastavit hodnoty, kdy se mají zapnout a kdy vypnout světla a hodnoty se zapíšou do eeprom.
Kód jsem objevil na těchto stránkách: https://www.titantalk.com/threads/home- ... ol.377145/ , najdete jak fotky tak popis jak to funguje.
Použil jsem jen dvě relátka pro světla a časově jsem je rozdělil pro potkávací a tlumené světla a místo relátka 1 jsem zapojil LED která slouží pro indikací pro ukládání do eeprom.
Tady bych potřeboval poradit:
V kódu jsem nepochopil zapojení LDR - photocellPin = 7; //analogový pin,- u analogu se značí piny A nebo ne, divné je že to jede tak či tak.
Nevim jestli jsem pochopil zapojení u mikrospinaču 1-2, jedna nožka se zapojí na pin 2 a 5 a druhá na pin 4 a 7 a zapoji se na zem a nebo ne…
Nevím k čemu slouží rele 4 asi pro osvětlení přepínačů na palubce.
Tady je kod….

Kód: Vybrat vše

/*
Tato skica se používá s děličem napětí fotobuňky / rezistoru ke snímání úrovní okolního světla
pro ovládání obecné 4 reléové desky, kde „nízko“ na vstupním pinu relé desky
napájí cívku relé a zavírá NO kontakty. fotobuňka je připojena mezi 5v a
analogový pin, 10k relé je připojeno ze stejného analogového pinu k zemi
úrovně světla se odečítají v 1024 úrovních, poté se dělí 4, aby se povolily úrovně velikosti bajtů (255)
2 momentální mikrospinače se používají k nastavení hodnot zapnutého a vypnutého světla.
hodnoty nastavení úrovně osvětlení se zapisují do eeprom pokaždé, když jsou nastaveny tak, aby přežily stav vypnutí,
pokud stisknete obě tlačítka, kód obnoví výchozí hodnoty a zapíše do eeprom

https://www.titantalk.com/threads/home-mdae-auto-headlight-control.377145/
*/

#include <EEPROM.h>  // použijte knihovnu eeprom pro uložení úrovní

int led = 13;        // pin na desce LED, slouží k indikaci, ON/OFF světlel
int relay1pin = 9;   // relé 1 slouží k ovládání indikátoru na kolébce nebo palubní desce
int relay2pin = 10;  // relé 2 světlometu
int relay3pin = 11;  // relé 3 světlometu  
int relay4pin = 12;  // osvětlení přepinaču na palubce relé 4
int switch1pin1 = 2; // mikrospinače, nastavení úrovně světlo
int switch1pin2 = 4; // mikrospinače, nastavení úrovně světlo - tento pin je vynucen jako výstup na nízkou, aby byl použit jako přepínač "zem"
int switch2pin1 = 5; // mikrospinače, nastavení úrovně tma
int switch2pin2 = 7; // mikrospinače, nastavení úrovně tma - tento pin je vynucen jako výstup na nízkou, aby byl použit jako přepínač "zem"
int sw1state = 0;    // proměnná pro stav přepínače 1
int sw2state = 0;    // proměnná pro stav spínače 2
int onlevel;         // prahová úroveň, kde jsou relé 2,3,4 zapnuta (světla zapnuta)
int offlevel;        // prahová úroveň, kde jsou relé 2,3,4 vypnuta (světla vypnuta)
int defaultonlevel = 75;   // prahová úroveň, kde jsou sepnuta relé 2,3,4 (rozsvícená světla)
int defaultofflevel = 175; // prahová úroveň, kde jsou relé 2,3,4 vypnuta (světla vypnuta) v
int cycletime = 250;   // doba vzorkování fotorezitoru v ms
int offdelay = 10000;  // zpoždění čekání na převzorkování úrovně a poté zhasnutí světel, pokud je stále nad vypnutou úrovní v ms
int headlampstate = 0; // stav světlometů 0 = světla nesvítí 1 = světla svítí
int photocellPin = 7;  // analogový pin,LDR a 10K pulldown
int photocellReading;  // analogové čtení z děliče napětí fotobuňky/rezistoru (světelný senzor)

void setup(void) { 

Serial.begin(9600); 
pinMode(switch1pin1, INPUT_PULLUP);
pinMode(switch2pin1, INPUT_PULLUP); 
pinMode(switch1pin2, OUTPUT); 
pinMode(switch2pin2, OUTPUT);
pinMode(relay1pin, OUTPUT);
pinMode(relay2pin, OUTPUT);
pinMode(relay3pin, OUTPUT);

pinMode(relay4pin, OUTPUT);
digitalWrite(led, LOW);         // vypněte LED 
digitalWrite(switch1pin2, LOW); // nastaveno na úroveň země 0 voltů
digitalWrite(switch2pin2, LOW); // nastaveno na úroveň země 0 voltů
digitalWrite(relay1pin, LOW);   // zavřete kontakt relé 1, použijte pro indikátor pomlčky
digitalWrite(relay2pin, HIGH);  // rozepne kontakt relé 2, zhasne
digitalWrite(relay3pin, HIGH);  // rozepne kontakt relé 3, světla zhasnou
digitalWrite(relay4pin, HIGH);  // rozepnutý kontakt relé 4, světla vypnutá

onlevel = EEPROM.read(1);       // získejte prahovou úroveň (svítí) z eeprom a nastavte programovou proměnnou tak, aby odpovídala
offlevel = EEPROM.read(0);      // získejte prahovou úroveň (zhasne) z eeprom a nastavte programovou proměnnou tak, aby odpovídala
}

void loop(void) {
photocellReading = analogRead(photocellPin) / 4; // Světelný senzor vzorku pak vydělte 4, takže hodnoty mohou být uloženy v jednotlivých bajtech v eeprom
sw1state = digitalRead(switch1pin1); // poloha mikrospinače 1 
sw2state = digitalRead(switch2pin1); // poloha mikrospinače 2 

// Serial monitor
Serial.print(" Světla = "); 
Serial.print(headlampstate);
Serial.print(" SW1 = ");
Serial.print(sw1state);
Serial.print(" SW2 = ");
Serial.print(sw2state);
Serial.print(" ON = ");
Serial.print(onlevel);
Serial.print(" OFF = ");
Serial.print(offlevel);
Serial.print(" Čtení  = ");
Serial.println(photocellReading);

delay(cycletime);         // počkejte, poté zkontroluje polohy mikrospinaču a porovnejte hodnotu světelného senzoru s úrovněmi ON/OFF
if (sw1state == 0) {      // pokud se stiskl mikrospinač, nastaví se na úroven aktuální hodnoty světelného senzoru
onlevel = photocellReading;
EEPROM.write(1, onlevel);      // zapsat aktuální úroveň na eeprom umístění 1
digitalWrite(relay1pin, HIGH); // cvaknutí rele 1x, potvrďte stisknutí mikrospinače 
delay(500);
digitalWrite(relay1pin, LOW);
}
if (sw2state == 0) {    // pokud byli stisknute oba mikrospínače 
if (sw1state == 0) {    // pokud byli stisknute oba mikrospínače třikrát blikne LED
onlevel = defaultonlevel;
offlevel = defaultofflevel;
EEPROM.write(1, onlevel);  // zapsat aktuální úroveň na eeprom 1
EEPROM.write(0, offlevel); // zapsat aktuální úroveň na eeprom 0

digitalWrite(relay1pin, HIGH); 
delay(500);
digitalWrite(relay1pin, LOW);
delay(500);
digitalWrite(relay1pin, HIGH);
delay(500);
digitalWrite(relay1pin, LOW);
delay(500);
digitalWrite(relay1pin, HIGH);
delay(500);
digitalWrite(relay1pin, LOW);
}
else {
offlevel = photocellReading;   // pokud bylo stisknuto pouze sw2, vypněte úroveň na aktuální úroveň světla
EEPROM.write(0, offlevel);     // zapište aktuální off oroveň do umístění eeprom 1
digitalWrite(relay1pin, HIGH); // blikáním relé 1 zapnuto potvrďte stisknutí tlačítka
delay(500);
digitalWrite(relay1pin, LOW);
}
}
if (photocellReading > offlevel){ // zkontrolujte, zda je jasné, že je třeba vypnout světla
if (headlampstate == 1){          // podívejte se, jestli svítí světla, pokud ano, připravte se je vypnout
delay(offdelay);                  // počkejte, abyste se ujistili, že to nebylo jen chvilkové světlo
photocellReading = analogRead(photocellPin) / 4;   // přečtěte si fotobuňku a znovu ji vydělte 4
if (photocellReading > offlevel)headlampstate = 0; // pokud je po čekání stále dostatečně světlo .. vypněte je
}
}
if (photocellReading < onlevel){ //zjistěte, zda je dostatečně tma na rozsvícení
headlampstate = 1;              // nastavit proměnu tak, aby říkala zapnutí em
}
// logic to actuate relays
if (headlampstate == 0){       // nula znamená vypnout je
digitalWrite(led, LOW);        // LED indikátor ON 
digitalWrite(relay2pin, LOW);  // ON tlumená relé 2 vypnout světla
delay(800);                    // čas pro sepnutí rele
digitalWrite(relay3pin, LOW);  // ON potkavací relé 3 vypnout světla
delay(1500);                   // čas pro sepnutí rele
//digitalWrite(relay4pin, LOW);// rozepnout relé 4 vypnout světla
}
else {
digitalWrite(led, HIGH);         // cokoli kromě nuly znamená zapnout em ... zapnout LED na NANO pro indikaci
digitalWrite(relay3pin, HIGH);   // OFF tlumená relé 2 zapnete světla
delay(800);                      // čas pro sepnutí rele
digitalWrite(relay2pin, HIGH);   // OFF potkavací relé 3 zapnete světla
delay(1500);                     // čas pro sepnutí rele
//digitalWrite(relay4pin, HIGH); // zavřením relé 4 zapnete světla
}
}