Close

ArduXPP

Vytvořené odpovědi

Aktuálně je na stránce zobrazeno 30 příspěvků - 691. až 720. (celkem z 2,768)
  • Autor
    Příspěvky
  • odpověď na: Ovládání teplovzdušného vytápění #10516
    mystriks
    Účastník

    pouzil jsem id reader a pri tom se na display objevi jakoby radkovani kazdy druhy pixel.

    Initializing LCD…
    Reading ID…0x0000
    Loading LCD registers…
    Filling the screen…
    Done filling…
    If your screen filled red, you may be able to use the library at http://misc.ws

    /*********************************************************************
    *
    * LCD_ID_Reader
    *
    * This sketch is meant only to attempt to read the driver ID code
    * from inexpensive touchscreen LCDs found on eBay without needing to
    * load any additional libraries.  The hope is to identify the most 
    * common varieties and choose the best library for the screen you have.
    *
    * This has been successfully tested so far on 992X and 778X variety
    * screens.
    *
    * Usage: 
    *
    * Compile the sketch and run it on your board with the screen
    * attached.  In the serial monitor, you should see a message containing
    * the driver code.  The tricky thing is that if it does not work, the
    * results may be undetermined.  However, if we can compile a list,
    * the difference between working and not may become more evident.
    *
    * Please visit http://misc.ws/lcd_information for more information.
    *
    * Version 1.2 - January 29th, 2015
    * 
    *********************************************************************/
    
    /*********************************************************************
    *
    * PIN ASSIGNMENTS
    *
    * You can alter the pin assignments to reflect any configuration you
    * wish.  I've provided the default shield configuration, which works
    * on both the Arduino UNO and Mega 2560.
    * 
    *********************************************************************/
    //-- Arduino UNO or Mega 2560 Plugged as shield
    #define LCD_RST A4
    #define LCD_CS A3
    #define LCD_RS A2
    #define LCD_WR A1
    #define LCD_RD A0
    
    #define LCD_D0 8
    #define LCD_D1 9
    #define LCD_D2 2
    #define LCD_D3 3
    #define LCD_D4 4
    #define LCD_D5 5
    #define LCD_D6 6
    #define LCD_D7 7
    
    /*********************************************************************
    *
    * Attempt to initialize and reset LCD, then read its Driver Code
    * at register index 0.
    * 
    *********************************************************************/
    void setup() {
      
      char hexString[7];
      uint16_t id;
      
      Serial.begin(9600);
      Serial.println("Initializing LCD...");
      lcdInit();
      lcdReset();
      
      delay(500);
      
      Serial.print("Reading ID...");
      id = lcdReadID();
      sprintf(hexString, "0x%0.4X", id); 
      Serial.println( hexString );
      
      if( id == 0x7783 ) {
        lcdRegister7783();
        lcdFillScreen(0xF800);
        Serial.println("If your screen filled red, then you may be able to use the library at ;
      } else if( id == 0x0154 ) {
        lcdRegister0154();
        lcdFillScreen(0xF800);
        Serial.println("If your screen filled red, please report it at ;
        Serial.println("There is currently no known working library.");
      } else {
        lcdRegisterOther();
        lcdFillScreen(0xF800);
        Serial.println("If your screen filled red, you may be able to use the library at http://misc.ws");
      } 
      
      //print_all_regs();
    }
    
    void print_all_regs() {
      char str[60];
      uint16_t i, val;
    
      for(i=0; i < 256; i++ )
      {
        delay(40);
        val = lcdReadRegister(i);
        sprintf(str, "Register 0x%0.2X : 0x%0.4X", i, val);
        Serial.println( str );
      }  
    }
    
    void loop() {
      
    }
    
    /*********************************************************************
    *
    *   LCD Functions - Inefficient but should be good enough 
    *                   to read the ID.
    *
    *********************************************************************/
    void lcdRegister0154() {
      lcdWriteRegister(0x000C, 0x130); 
      lcdWriteRegister(0x0080, 0x8d);
      lcdWriteRegister(0x0092, 0x10);
      lcdWriteRegister(0x0011, 0x1b);
      lcdWriteRegister(0x0012, 0x3101);
      lcdWriteRegister(0x0013, 0x105f);
      lcdWriteRegister(0x0014, 0x667f);
      lcdWriteRegister(0x0010, 0x800);
      delay(20); 
      lcdWriteRegister(0x0011, 0x11b);
      delay(20); 
      lcdWriteRegister(0x0011, 0x31b);
      delay(20); 
      lcdWriteRegister(0x0011, 0x71b);
      delay(20); 
      lcdWriteRegister(0x0011, 0xf1b);
      delay(20); 
      lcdWriteRegister(0x0011, 0xf3b);
      delay(30); 
      lcdWriteRegister(0x0001, 0x2128);
      lcdWriteRegister(0x0002, 0x100);
      lcdWriteRegister(0x0003, 0x1030);
      lcdWriteRegister(0x0007, 0); 
      lcdWriteRegister(0x0008, 0x808);
      lcdWriteRegister(0x000B, 0x1100);
      lcdWriteRegister(0x000F, 0xf01);
      lcdWriteRegister(0x0015, 0);
      lcdWriteRegister(0x0030, 0);
      lcdWriteRegister(0x0034, 319); 
      lcdWriteRegister(0x0035, 0); 
      lcdWriteRegister(0x0036, 239); 
      lcdWriteRegister(0x0037, 0); 
      lcdWriteRegister(0x0038, 319); 
      lcdWriteRegister(0x0039, 0); 
      lcdWriteRegister(0x0050, 0);
      lcdWriteRegister(0x0051, 0xf00);
      lcdWriteRegister(0x0052, 0xa03);
      lcdWriteRegister(0x0053, 0x300);
      lcdWriteRegister(0x0054, 0xc05);
      lcdWriteRegister(0x0055, 0xf00);
      lcdWriteRegister(0x0056, 0xf00);
      lcdWriteRegister(0x0057, 3);
      lcdWriteRegister(0x0058, 0x1f07);
      lcdWriteRegister(0x0059, 0x71f);
      delay(20);
      lcdWriteRegister(0x0007, 0x12);
      delay(20);
      lcdWriteRegister(0x0007, 0x13);
    }
    
    void lcdRegisterOther() {
      Serial.println("Loading LCD registers...");
      lcdWriteRegister(0x00e5,0x8000);
      lcdWriteRegister(0x0000,0x0001);
      lcdWriteRegister(0x0001,0x0100);
      lcdWriteRegister(0x0002,0x0700);
      lcdWriteRegister(0x0003,0x1030);
      lcdWriteRegister(0x0004,0x0000);
      lcdWriteRegister(0x0008,0x0202);
      lcdWriteRegister(0x0009,0x0000);
      lcdWriteRegister(0x000a,0x0000);
      lcdWriteRegister(0x000c,0x0000);
      lcdWriteRegister(0x000d,0x0000);
      lcdWriteRegister(0x000f,0x0000);
      lcdWriteRegister(0x0010,0x0000);
      lcdWriteRegister(0x0011,0x0000);
      lcdWriteRegister(0x0012,0x0000);
      lcdWriteRegister(0x0013,0x0000);
      lcdWriteRegister(0x0010,0x17b0);
      lcdWriteRegister(0x0011,0x0037);
      lcdWriteRegister(0x0012,0x0138);
      lcdWriteRegister(0x0013,0x1700);
      lcdWriteRegister(0x0029,0x000d);
      lcdWriteRegister(0x0020,0x0000);
      lcdWriteRegister(0x0021,0x0000);
      lcdWriteRegister(0x0030,0x0001);
      lcdWriteRegister(0x0031,0x0606);
      lcdWriteRegister(0x0032,0x0304);
      lcdWriteRegister(0x0033,0x0202);
      lcdWriteRegister(0x0034,0x0202);
      lcdWriteRegister(0x0035,0x0103);
      lcdWriteRegister(0x0036,0x011d);
      lcdWriteRegister(0x0037,0x0404);
      lcdWriteRegister(0x0038,0x0404);
      lcdWriteRegister(0x0039,0x0404);
      lcdWriteRegister(0x003c,0x0700);
      lcdWriteRegister(0x003d,0x0a1f);
      lcdWriteRegister(0x0050,0x0000);
      lcdWriteRegister(0x0051,0x00ef);
      lcdWriteRegister(0x0052,0x0000);
      lcdWriteRegister(0x0053,0x013f);
      lcdWriteRegister(0x0060,0x2700);
      lcdWriteRegister(0x0061,0x0001);
      lcdWriteRegister(0x006a,0x0000);
      lcdWriteRegister(0x0090,0x0010);
      lcdWriteRegister(0x0092,0x0000);
      lcdWriteRegister(0x0093,0x0003);
      lcdWriteRegister(0x0095,0x0101);
      lcdWriteRegister(0x0097,0x0000);
      lcdWriteRegister(0x0098,0x0000);
      lcdWriteRegister(0x0007,0x0021);
      lcdWriteRegister(0x0007,0x0031);
      lcdWriteRegister(0x0007,0x0173);
    }
    
    void lcdRegister7783() {
        
      lcdWriteRegister(0x0001,0x0100);    
      lcdWriteRegister(0x0002,0x0700);    
      lcdWriteRegister(0x0003,0x1030);    
      lcdWriteRegister(0x0008,0x0302);    
      lcdWriteRegister(0x0009,0x0000);   
      lcdWriteRegister(0x000A,0x0008);    
      lcdWriteRegister(0x0010,0x0790);    
      lcdWriteRegister(0x0011,0x0005);    
      lcdWriteRegister(0x0012,0x0000);   
      lcdWriteRegister(0x0013,0x0000); 
      lcdWriteRegister(0x0010,0x12B0);    
      lcdWriteRegister(0x0011,0x0007);  
      lcdWriteRegister(0x0012,0x008C);   
      lcdWriteRegister(0x0013,0x1700);    
      lcdWriteRegister(0x0029,0x0022);    
      lcdWriteRegister(0x0030,0x0000);    
      lcdWriteRegister(0x0031,0x0505);    
      lcdWriteRegister(0x0032,0x0205);    
      lcdWriteRegister(0x0035,0x0206);    
      lcdWriteRegister(0x0036,0x0408);    
      lcdWriteRegister(0x0037,0x0000);   
      lcdWriteRegister(0x0038,0x0504);
      lcdWriteRegister(0x0039,0x0206);    
      lcdWriteRegister(0x003C,0x0206);   
      lcdWriteRegister(0x003D,0x0408);    
      lcdWriteRegister(0x0050,0x0000);
      lcdWriteRegister(0x0051,0x00EF);   
      lcdWriteRegister(0x0052,0x0000);   
      lcdWriteRegister(0x0053,0x013F);   
      lcdWriteRegister(0x0060,0xA700);   
      lcdWriteRegister(0x0061,0x0001);   
      lcdWriteRegister(0x0090,0x0033); 
      lcdWriteRegister(0x0007,0x0133);
      lcdWriteRegister(0x0001,0x0100);
      lcdWriteRegister(0x0002,0x0700);    
      lcdWriteRegister(0x0003,0x1030);    
      lcdWriteRegister(0x0008,0x0302);    
      lcdWriteRegister(0x0009,0x0000);   
      lcdWriteRegister(0x000A,0x0008);    
      lcdWriteRegister(0x0010,0x0790);    
      lcdWriteRegister(0x0011,0x0005);    
      lcdWriteRegister(0x0012,0x0000);  
      lcdWriteRegister(0x0013,0x0000);    
      lcdWriteRegister(0x0010,0x12B0);    
      lcdWriteRegister(0x0011,0x0007);    
      lcdWriteRegister(0x0012,0x008C);    
      lcdWriteRegister(0x0013,0x1700);    
      lcdWriteRegister(0x0029,0x0022);    
      lcdWriteRegister(0x0030,0x0000);    
      lcdWriteRegister(0x0031,0x0505);    
      lcdWriteRegister(0x0032,0x0205);    
      lcdWriteRegister(0x0035,0x0206);    
      lcdWriteRegister(0x0036,0x0408);   
      lcdWriteRegister(0x0037,0x0000);    
      lcdWriteRegister(0x0038,0x0504);
      lcdWriteRegister(0x0039,0x0206);    
      lcdWriteRegister(0x003C,0x0206);    
      lcdWriteRegister(0x003D,0x0408);   
      lcdWriteRegister(0x0050,0x0000);
      lcdWriteRegister(0x0051,0x00EF);   
      lcdWriteRegister(0x0052,0x0000);   
      lcdWriteRegister(0x0053,0x013F);   
      lcdWriteRegister(0x0060,0xA700);   
      lcdWriteRegister(0x0061,0x0001);   
      lcdWriteRegister(0x0090,0x0033);
      lcdWriteRegister(0x0007,0x0133);
    }
    
    void lcdInit() {
      pinMode(LCD_CS, OUTPUT);
      digitalWrite(LCD_CS, HIGH);
      pinMode(LCD_RS, OUTPUT);
      digitalWrite(LCD_RS, HIGH);
      pinMode(LCD_WR, OUTPUT);
      digitalWrite(LCD_WR, HIGH);
      pinMode(LCD_RD, OUTPUT);
      digitalWrite(LCD_RD, HIGH);
      pinMode(LCD_RST, OUTPUT);
      digitalWrite(LCD_RST, HIGH);  
    }
    
    void lcdReset() {
      digitalWrite(LCD_RST, LOW);
      delay(2); 
      digitalWrite(LCD_RST, HIGH);
      lcdWriteData(0);
      lcdWriteData(0);
      lcdWriteData(0);
      lcdWriteData(0);
    }
    
    void lcdWrite8(uint16_t data) {
      digitalWrite(LCD_D0, data & 1);
      digitalWrite(LCD_D1, (data & 2) >> 1);
      digitalWrite(LCD_D2, (data & 4) >> 2);
      digitalWrite(LCD_D3, (data & 8) >> 3);
      digitalWrite(LCD_D4, (data & 16) >> 4); 
      digitalWrite(LCD_D5, (data & 32) >> 5);
      digitalWrite(LCD_D6, (data & 64) >> 6);
      digitalWrite(LCD_D7, (data & 128) >> 7);  
    }
    
    uint16_t lcdRead8() {
      uint16_t result = digitalRead(LCD_D7);
      result <<= 1;
      result |= digitalRead(LCD_D6);
      result <<= 1;
      result |= digitalRead(LCD_D5);
      result <<= 1; 
      result |= digitalRead(LCD_D4); 
      result <<= 1;
      result |= digitalRead(LCD_D3);
      result <<= 1;
      result |= digitalRead(LCD_D2); 
      result <<= 1;
      result |= digitalRead(LCD_D1);
      result <<= 1;
      result |= digitalRead(LCD_D0); 
      
      return result;
    }
    
    void lcdSetWriteDir() {
      pinMode(LCD_D0, OUTPUT);
      pinMode(LCD_D1, OUTPUT);
      pinMode(LCD_D2, OUTPUT);
      pinMode(LCD_D3, OUTPUT);  
      pinMode(LCD_D4, OUTPUT);  
      pinMode(LCD_D5, OUTPUT);
      pinMode(LCD_D6, OUTPUT);
      pinMode(LCD_D7, OUTPUT);  
    }
    
    void lcdSetReadDir() {
      pinMode(LCD_D0, INPUT);
      pinMode(LCD_D1, INPUT);
      pinMode(LCD_D2, INPUT);
      pinMode(LCD_D3, INPUT);  
      pinMode(LCD_D4, INPUT);  
      pinMode(LCD_D5, INPUT);
      pinMode(LCD_D6, INPUT);
      pinMode(LCD_D7, INPUT);    
    }
    
    void lcdWriteData(uint16_t data) {
      
      lcdSetWriteDir();
      digitalWrite(LCD_CS, LOW);
      digitalWrite(LCD_RS, HIGH);
      digitalWrite(LCD_RD, HIGH);
      digitalWrite(LCD_WR, HIGH);
      
      lcdWrite8(data >> 8);
      
      digitalWrite(LCD_WR, LOW);
      delayMicroseconds(10);
      digitalWrite(LCD_WR, HIGH);
      
      lcdWrite8(data);
      
      digitalWrite(LCD_WR, LOW);
      delayMicroseconds(10);
      digitalWrite(LCD_WR, HIGH);
      
      digitalWrite(LCD_CS, HIGH);  
    }
    
    void lcdWriteCommand(uint16_t command) {
      lcdSetWriteDir(); 
      digitalWrite(LCD_CS, LOW);
      digitalWrite(LCD_RS, LOW);
      digitalWrite(LCD_RD, HIGH);
      digitalWrite(LCD_WR, HIGH);  
      lcdWrite8(command >> 8);
      digitalWrite(LCD_WR, LOW);
      delayMicroseconds(10);
      digitalWrite(LCD_WR, HIGH);
      lcdWrite8(command);
      digitalWrite(LCD_WR, LOW);
      delayMicroseconds(10);
      digitalWrite(LCD_WR, HIGH);
      digitalWrite(LCD_CS, HIGH);    
    }
    
    int lcdReadData() {
      uint16_t result;
      lcdSetReadDir();
      digitalWrite(LCD_CS, LOW);
      digitalWrite(LCD_RS, HIGH);
      digitalWrite(LCD_RD, HIGH);
      digitalWrite(LCD_WR, HIGH);
      
      digitalWrite(LCD_RD, LOW);  
      delayMicroseconds(10);
      result = lcdRead8() << 8;
      digitalWrite(LCD_RD, HIGH);
      
      delayMicroseconds(10);
      
      digitalWrite(LCD_RD, LOW);
      delayMicroseconds(10);
      result |= lcdRead8();
      
      digitalWrite(LCD_RD, HIGH);
      digitalWrite(LCD_CS, HIGH);
      
      return result;
    }
    
    void lcdWriteRegister(uint16_t addr, uint16_t data) {
      lcdWriteCommand(addr);
      lcdWriteData(data);
    }
    
    uint16_t lcdReadRegister(uint16_t reg) {
      lcdWriteCommand(reg);
      return lcdReadData();
    }
    
    uint16_t lcdReadID() {
      return lcdReadRegister(0x00);
    }
    
    void lcdFillScreen(uint16_t color) {
      
      Serial.println("Filling the screen...");
      
      /*lcdWriteRegister(0x0050, 0);
      lcdWriteRegister(0x0051, 219);  
      lcdWriteRegister(0x0052, 0);
      lcdWriteRegister(0x0053, 319);  
      */
      lcdWriteRegister(0x0020, 0);
      lcdWriteRegister(0x0021, 0);
      lcdWriteCommand(0x0022);
      
      digitalWrite(LCD_CS, LOW);
      digitalWrite(LCD_RS, HIGH);
      digitalWrite(LCD_RD, HIGH);
      digitalWrite(LCD_WR, HIGH);
     
      lcdSetWriteDir();
      
      uint32_t i = 320;
      i *=240;
    
      while( i-- ) {
        lcdWrite8(color >> 8);
        digitalWrite(LCD_WR, LOW);
        delayMicroseconds(10);
        digitalWrite(LCD_WR, HIGH); 
        lcdWrite8(color);
        digitalWrite(LCD_WR, LOW);
        delayMicroseconds(10);
        digitalWrite(LCD_WR, HIGH); 
      }
      
      digitalWrite(LCD_CS, HIGH); 
      Serial.println("Done filling...");
      
    }
    odpověď na: Ovládání teplovzdušného vytápění #10514
    mystriks
    Účastník

    zkoušel jsem zprovoznit tftlcd shield (ili9341) pouzil jsem adafruit_tftlcd a graphictest ale píše mi to tohle:

    TFT LCD test
    Using Adafruit 2.8″ TFT Arduino Shield Pinout
    TFT size is 240×320
    Unknown LCD driver chip: 0
    If using the Adafruit 2.8″ TFT Arduino shield, the line:
    #define USE_ADAFRUIT_SHIELD_PINOUT
    should appear in the library header (Adafruit_TFT.h).
    If using the breakout board, it should NOT be #defined!
    Also if using the breakout, double-check that all wiring
    matches the tutorial.

    piny mam definovane takhle mely by bit spravne
    #define LCD_CS A3 // Chip Select goes to Analog 3
    #define LCD_CD A2 // Command/Data goes to Analog 2
    #define LCD_WR A1 // LCD Write goes to Analog 1
    #define LCD_RD A0 // LCD Read goes to Analog 0

    #define LCD_RESET A4 // Can alternately just connect to Arduino’s reset pin

    odpověď na: adresovatelný led pásek, změna efektů #10513
    Vojtěch Vosáhlo
    Účastník

    Pokud to tedy chápu správně, místo použití příkazu switch mám použít vypsaní všech možností podmínkou if

    To úplně neříkám. Já použil if pouze protože jsem volal jen jednu funkci, jen kvůli jednoduchosti. Vy můžete nadále používat switch case. Pokud byste chtěl mít kód optimalizovaný na max, dá se použít něco takového:

    
    #include <Adafruit_NeoPixel.h>
    #include"IRremote2.h"
    
    ///Deklarace pouzitych funci
    void funkce1();
    void funkce2();
    
    #define pinIN 4
    #define PIN   6
    // Parametr 1 = počet pixelů (LED diod) na pásek
    // Parametr 2 = číslo PINu Arduina
    // Parametr 3 = pixel type flags, add together as needed:
    // NEO_KHZ800  800 KHz kmitočet pro pásky s WS2812 LED diodami)
    // NEO_GRB  Pixely jsou zasílány ve formátu GRB 
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800);
    IRrecv dalkoveOvl(pinIN);
    decode_results vysledek;
    char pozice;
    
    typedef void (* Caller)();
    Caller funkce[] = {&funkce1, &funkce2}; ///FUNKCE KTERE CHCETE VOLAT
    char serial_prikazy[] = {'1', '2'}; ///PRIKAZY KORESPONDUJICI S FUNKCEMI tzn. 1 vola funkce1
    int32_t ir_prikazy[] = {0x00FFA25D, 0xFFE21D};
    char data;
    
    void setup(){
      pixels.begin();
      Serial.begin(9600);
      pixels.show();
      delay(250);
      dalkoveOvl.enableIRIn();
    }
    
    ///////////////////////////////////////////////////////////////////////
    //////////////FUNKCE KTERE BUDOU VOLANE PRIKAZY //////////////////////
    void funkce1(){
      dalkoveOvl.resume();
    
      while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
      {
        pixels.setPixelColor(6, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(6, pixels.Color(0,0,0));
        pixels.show();
        delay(200);    
        pixels.setPixelColor(6, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(6, pixels.Color(0,0,0));
        pixels.show();
        delay(200);
      }
    }
    
    void funkce2(){
      dalkoveOvl.resume();
    
      while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
      {
        pixels.setPixelColor(16, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(16, pixels.Color(0,0,0));
        pixels.show();
        delay(200);    
        pixels.setPixelColor(16, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(16, pixels.Color(0,0,0));
        pixels.show();
        delay(200);
      }
    }
    
    /////////////////////////////////////////////////////////////////////
    
    void loop(){
      
        if(Serial.available() || dalkoveOvl.decode(&vysledek)){
          
        data = Serial.read();
        
            for(int i = 0; i < sizeof(funkce); i++){
                if(data == serial_prikazy[i] || vysledek.value == ir_prikazy[i]){
                  
                    funkce[i]();
                  
                  }
              
              }
              
        }
    }
    
    

    Prakticky si na začátku zapíšete všechny různé funkce a pak už se jen volají podle příkazů. Je to kratší a nemusíte používat switch case.
    Nejdůležitější je deklarovat si na začátku všechny „blikací a svítící“ funkce asi takto

    void funkce1();
    void funkce2();

    Těch tam může být kolik chce.
    Poté si zapíšete příkazy které funkce spouští jako tady: `Caller funkce[] = {&funkce1, &funkce2}; ///FUNKCE KTERE CHCETE VOLAT
    char serial_prikazy[] = {‚1‘, ‚2‘}; ///PRIKAZY KORESPONDUJICI S FUNKCEMI tzn. 1 vola funkce1
    int32_t ir_prikazy[] = {0x00FFA25D, 0xFFE21D};`

    V Caller funkce[] jsou zapsány samotné funkce které se budou volat, zapisujete je jako &nazevfunkce. V serial_prikazy[] jsou sériové příkazy které spouští dané funkce tzn. příkaz na 1. pozici spustí funkci na 1. pozici v tom Caller funkce[]. V poli ir_prikazy[] jsou opět korespondující příkazy které spouští funkce. Musí být zapsány jako 0x00vasirkod. Ten kód co jsem přihodil by měl fungovat jako ten váš se switch case nebo if. Schválně zkuste a uvidíme.

    Obnovení předešlé animace kdyžtak vyřešíme jestli tohle bude fungovat.

    odpověď na: Win xp chyba pri nahravani #10512
    Dominic
    Účastník

    A jaky ovladac?…toho funduina una?…a kde ho najdu?

    odpověď na: Win xp chyba pri nahravani #10511
    ArduXPP
    Účastník

    Asi děláte ve windows XP poprvé ? Je to stejný jako třeba u USB flash, když ho chci používat, tak musím nainstalovat driver ( ovladač) , to stejný je u arduino uno či Funduino UNO R3.

    odpověď na: adresovatelný led pásek, změna efektů #10509
    Hint
    Účastník

    Tak po menší úpravě vašeho návrhu už zřejmě funguje jak má, přepíná po sériové lince i přes IR. Pokud to tedy chápu správně, místo použití příkazu switch mám použít vypsaní všech možností podmínkou if
    a zárověň mě napadlo zda jde ještě nějak zapsat podmínka, když nepřijme data která má v podmínkach, neudělá nic a bude pokračovat v předchozím efektu. Uvědomil jsem si totiž že při ovladaní TV bude IR ovlivňovat i arduino přijímač a vypínat efekty.

    
    #include <Adafruit_NeoPixel.h>
    #include"IRremote2.h"
    
    #define pinIN 4
    #define PIN   6
    // Parametr 1 = počet pixelů (LED diod) na pásek
    // Parametr 2 = číslo PINu Arduina
    // Parametr 3 = pixel type flags, add together as needed:
    // NEO_KHZ800  800 KHz kmitočet pro pásky s WS2812 LED diodami)
    // NEO_GRB  Pixely jsou zasílány ve formátu GRB 
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800);
    IRrecv dalkoveOvl(pinIN);
    decode_results vysledek;
    char pozice;
    
    void setup() {
      pixels.begin();
      Serial.begin(9600);
      pixels.show();
      delay(250);
      dalkoveOvl.enableIRIn();
    }
    
    void loop()
    {
      if (dalkoveOvl.decode(&vysledek)) 
      {
        detekceKlaves();
        dalkoveOvl.resume();
      }
      if (Serial.available() > 0)
      {
        pozice = Serial.read();
        if(pozice == '1') blika();
        if(pozice == '2') blika1();
      }
    }
    
    void detekceKlaves() 
    {
      if(vysledek.value == 0xFFA25D) 
      {
    
          Serial.println("Stisknuto CH-");
          blika();
    
      // pauza pro přehlednější výpis
      delay(500);
      }
      if(vysledek.value == 0xFFE21D) 
      {
    
          Serial.println("Stisknuto CH-");
          blika1();
    
      // pauza pro přehlednější výpis
      delay(500);
      }
      
    }
    
    void blika()
    {
     dalkoveOvl.resume();
    
      while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
      {
        pixels.setPixelColor(6, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(6, pixels.Color(0,0,0));
        pixels.show();
        delay(200);    
        pixels.setPixelColor(6, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(6, pixels.Color(0,0,0));
        pixels.show();
        delay(200);
      }
    }
    
    void blika1()
    {
     dalkoveOvl.resume();
    
      while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
      {
        pixels.setPixelColor(16, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(16, pixels.Color(0,0,0));
        pixels.show();
        delay(200);    
        pixels.setPixelColor(16, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(16, pixels.Color(0,0,0));
        pixels.show();
        delay(200);
      }
    }
    
    odpověď na: adresovatelný led pásek, změna efektů #10508
    Vojtěch Vosáhlo
    Účastník

    Zkuste něco takového jako zjednodušený kód. Mělo by to blikat s prvním pixelem pokud zmáčknete CH- nebo pošlete 1. Pokud přijde něco jiného, smyčka by se měla přerušit.

    #include <Adafruit_NeoPixel.h>
    #include"IRremote2.h"
    
    #define pinIN 4
    #define PIN   6
    // Parametr 1 = počet pixelů (LED diod) na pásek
    // Parametr 2 = číslo PINu Arduina
    // Parametr 3 = pixel type flags, add together as needed:
    // NEO_KHZ800  800 KHz kmitočet pro pásky s WS2812 LED diodami)
    // NEO_GRB  Pixely jsou zasílány ve formátu GRB 
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800);
    IRrecv dalkoveOvl(pinIN);
    decode_results vysledek;
    char pozice;
    
    void setup() {
      pixels.begin();
      Serial.begin(9600);
      pixels.show();
      int delayval = 300;
      delay(250);
      dalkoveOvl.enableIRIn();
    }
    
    void loop()
    {
      if (dalkoveOvl.decode(&vysledek)) 
      {
        detekceKlaves();
        dalkoveOvl.resume();
      } 
      if (Serial.available() > 0)
      {
      pozice = Serial.read();
        if(pozice == 1) blikejLed();
      }
    }
    
    void detekceKlaves() {
      if(vysledek.value == 0xFFA25D) {
    
          Serial.println("Stisknuto CH-");
          blikejLed();
    
      // pauza pro přehlednější výpis
      delay(500);
    }
    
    void blikejLed(){
     dalkoveOvl.resume();
    
      while(!(Serial.available() || dalkoveOvl.decode(&vysledek))){
    
        pixels.setPixelColor(1, pixels.Color(255,255,255));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(1, pixels.Color(0,0,0));
        pixels.show();
        delay(1000);
    
      }
     
    }
    
    
    odpověď na: ovladani klapky privodu vzduchu #10506

    ahj, diky moc za vase snazeni, byl jsem ted par dni mimo, ale zase se do toho chci pustit

    muzu poprosit o to zjednodusene schema, nasel jsem na fb neco hodne podobneho

    a jeste jsem chtel pozadat, jak presne zapojit tu klapku

    http://marcomplet.cz/docs/Belimo/belimo_cm24-SR.pdf

    diky moc pratele

    Attachments:
    odpověď na: Displej z mobilu na funduino uno #10505
    Zbyšek Voda
    Účastník

    Ne, když chcete, aby Arduino něco dělalo, musíte ho naprogramovat…

    O displejích viz třeba tady: http://dontbuyjustmake.blogspot.cz/2015/01/reusing-your-ancient-mobile-phone-lcd.html

    odpověď na: Displej z mobilu na funduino uno #10504
    Dominic
    Účastník

    Dobre ale pokud nenahraju nejak program do desk tak mi to stejne nebude nic delat ze?

    odpověď na: Displej z mobilu na funduino uno #10503
    Luke_CZ
    Účastník

    Samozřejmě, stačí použít Google.

    L.

    odpověď na: Displej z mobilu na funduino uno #10502
    Dominic
    Účastník

    Takze z nejake nokie 3310 nebo simens c35 by to melo jit?

    odpověď na: Displej z mobilu na funduino uno #10501
    Luke_CZ
    Účastník

    Důležité je z jakého mobilu je. Pokud z nějakého starého, tak to by šlo, z nových dotykových ne, to by musel být displej i s řadičem a ten je na základní desce a nevím o takovém, který by měl řadič přímo fyzicky na displeji.

    L.

    odpověď na: adresovatelný led pásek, změna efektů #10499
    Hint
    Účastník

    Děkuji moc za pomoc a váš čas. zkusím něco sepsat.

    odpověď na: adresovatelný led pásek, změna efektů #10498
    Vojtěch Vosáhlo
    Účastník

    Ozvu se zase zítra, možná si najde čas i někdo z ostatních a dřív, uvidíte. Já bych asi doporučil jednu věc. Udělejte čistý nový projekt pouze s nejnutnějšími funkcemi na přijímání z IR a Serial a spuštění nějaké jednoduché funkce. Omezte to na co nejmenčí kód, klidně jen něco jako po stisknutí ON na ovladači nebo poslání 1 na port rosviť ledky. Na tomhle zkusíme jak by se mělo postupovat s přerušením smyčky a bude to přehlednější než ten kód co máme teď. Zmenšením kódu taky omezíme prostor na chybu. Držím palce.

    Zbyšek Voda
    Účastník

    Máte pravdu, pardon. Návod nesepíšu, protože jsem to nikdy nedělal a ani se v dohledné době nechystám 🙂

    Zkuste se kouknout třeba sem
    http://www.instructables.com/id/ESP8266-OTA-LUA-With-WEB-UI-MANAGEMENT-Nodemcu-Fir/?ALLSTEPS

    a sem
    http://www.instructables.com/id/ESP8266-WiFi-File-Management/

    Takto se dá do ESP posílat přes prohlížeč zdrojáky ve skriptovacím jazyku LUA.

    Dzaraaa
    Účastník

    Zdravím 🙂 ta první varianta není pro NodeMCU, ale pro arduino s bluetooth.
    Mohl byste sepsat návod pro tu druhou variantu? Děkuji.

    odpověď na: adresovatelný led pásek, změna efektů #10493
    Hint
    Účastník

    omlouvám se zde přikládám zdroje knihovny
    knihovna ledpasku

    github knihovna ledpasku

    knihovnu na IR ovladač jsem stahl tady
    IR remote
    možná by pomohlo tohle
    IR remote wiki

    odpověď na: adresovatelný led pásek, změna efektů #10489
    Hint
    Účastník

    bohužel se mi nepovedlo to nějak rozběhat, ovladač pouze vypne probýhající smyčku, ale nespustí žádnou a přitom po seriové lince vypisuje stisknuté klavesy.

    odpověď na: adresovatelný led pásek, změna efektů #10485
    Vojtěch Vosáhlo
    Účastník

    Zkuste za while vložit dalkoveOvl.resume(); tzn bude to vypadat asi takto: `void nejakyefekt(){
    while(neco){
    }
    dalkoveOvl.resume();
    }
    `
    Pokud to nepojede tak se ozvěte. Zkuste taky poslat odkaz na knihovnu kterou přesně máte, jestli existuje dokumentace, bude to jednoduší.

    odpověď na: adresovatelný led pásek, změna efektů #10484
    Hint
    Účastník

    Díky moc, hned jsem vaši radu vyzkoušel a opravdu teď mohu vypnout smyčku i pomoci ovladače a sepnutí nového efektu přes seriovou linku pracuje ještě lépe než předtím, bohužel ale nevím proč, přestal program přijímat sepnutí smyček efektů, pouze ukončí smyčku. Ovladačem nejde spustit efekt ani po resetu arduina, když ještě nic neběží.
    Omlouvám se snad jsem to napsal srozumitelně.

    odpověď na: adresovatelný led pásek, změna efektů #10483
    Vojtěch Vosáhlo
    Účastník

    Mělo by stačit přidat k přerušení seriovou linkou i přerušení IR příjmem. Na začátku kódu máte v podmínce if toto: „dalkoveOvl.decode(&vysledek)“
    Vzhledem k tomu že je v podmínce, nejspíše vrátí 1/true/pravda pokud něco přijme a zvládne dekódovat a 0/false/nepravda pokud nic nepřijme nebo nedekóduje.
    Do vašeho while by tedy stačilo přidat logický operátor OR v arduinu jako ||. Ten vám dá 1 pokud alespoň jedna vstupní hodnota je 1. Smyčka by tedy vypadala asi takto while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))...
    Serial.available() se podívá jestli je něco dostupného na sériové lince a dalkoveOvl.decode() zjistí zda něco přijímáme. Pokud nic z tohoto neplatí dostaneme 0 která je vykřičníkem znegovaná na 1 a smyčka běží. Pokud bude ale jedna z možností 1, smyčka se zastaví.

    Mimo tohle by se dal kód ještě různě optimalizovat ale o tom kdyžtak jindy 😉

    odpověď na: Linux x Windows rozdíly v kompilaci? #10480
    Zbyšek Voda
    Účastník

    Začal jsem to zkoumat a je to celkem zajímavý problém.

    Zkusil jsem udělat úplně jednoduchou non-void funkci, která ale, stejně jako u vás, nic nevrací. Ta funkce vypadá takto:

    #include <stdint.h>
    
    uint8_t fce(){
        
    }
    
    int main(){
        uint8_t a = fce();
        
    	return 0;
    }

    Použil jsem uint8_t, protože boolean je vlastně „převlečený“ typ uint_8 – viz:
    typedef uint8_t boolean;

    Když tento miniprogram proženu přes kompilátor avr-gcc a zadám přepínače pro výstup v assembleru, získám kód níže. Příkaz pro spuštění kompilace je takovýto (jsem na MacOS):
    /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc -S main.c

    	.file	"main.c"
    __SP_H__ = 0x3e
    __SP_L__ = 0x3d
    __SREG__ = 0x3f
    __tmp_reg__ = 0
    __zero_reg__ = 1
    	.text
    .global	fce
    	.type	fce, @function
    fce:
    	push r28
    	push r29
    	in r28,__SP_L__
    	in r29,__SP_H__
    /* prologue: function */
    /* frame size = 0 */
    /* stack size = 2 */
    .L__stack_usage = 2
    /* epilogue start */
    	pop r29
    	pop r28
    	ret
    	.size	fce, .-fce
    .global	main
    	.type	main, @function
    main:
    	push r28
    	push r29
    	push __zero_reg__
    	in r28,__SP_L__
    	in r29,__SP_H__
    /* prologue: function */
    /* frame size = 1 */
    /* stack size = 3 */
    .L__stack_usage = 3
    	rcall fce
    	std Y+1,r24
    	ldi r24,0
    	ldi r25,0
    /* epilogue start */
    	pop __tmp_reg__
    	pop r29
    	pop r28
    	ret
    	.size	main, .-main
    	.ident	"GCC: (GNU) 4.9.2"
    

    K pochopení toho, co se děje, stačí najít řádek std Y+1,r24. Toto je instrukce v assembleru (viz . Slouží k tomu, že se někam do paměti na adresu danou Y+1 (proměnná a v programu) uloží hodnota z registru r24. Když se ale na program podíváte, do tohoto registru se předtím nic neukládá, ani se nenuluje, takže je hodnota nedefinovaná.

    Tento příklad je zjednodušený, v případě při kompilaci pro Arduino dojde k připojení několika dalších funkcí. Pro ilustraci je to ale myslím dobré 🙂

    Podle mě tedy dojde k tomu, že při kompilaci na Linuxu se ještě přidá instrukce pro vynulování registru r24. Je to ale jenom teorie. Můžete vyzkoušet, docela by mě zajímalo, jestli ten assemblerový kód vypadá stejně 🙂

    Zbyšek Voda
    Účastník

    Dobrý den, možná by to šlo, ale asi to nebude úplně přívětivé. Programování na iOS je popsané třeba tu: http://www.arduinocode.info .

    Také by to asi šlo pomocí OTA přes prohlížeč. K tomu byste potřeboval počítač jen při prvotním nahrání a potom už by to mělo jít přes prohlížeč více o OTA zde: http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html

    odpověď na: Linux x Windows rozdíly v kompilaci? #10476
    Zbyšek Voda
    Účastník

    Dobrý den, mě ta otázka přijde položená docela jasně 🙂

    Pouštím se teď na trochu tenký led, tak snad neplácnu nějakou blbost.

    Podle mě jde o to, že norma C++ nevynucuje návrat hodnoty z funkce pomocí return (i když tato funkce není void).Potom tedy závisí na kompilátoru, jak si s tím poradí. Použitý kompilátor pro Arduino je avr-gcc, který se ale asi na obou platformách chová trochu odlišně (právě v takovýchto normou nedefinovaných případech).

    Podle mě může dojít ke dvěma možnostem:
    1) Na linuxu je defaultní hodnota z funkcí bez return nulová, na Windows nenulová.
    Tato možnost ale asi není moc pravděpodobná.

    2) V https://gcc.gnu.org/wiki/avr-gcc píší, že jednobytové hodnoty se vrací pomocí registrů (ATmega v Arduinech je většinou 8-bitová, takže má i 8-bit registry). Boolean je jenom jiné pojmenování pro bezznaménkové osmibitové číslo, takže se asi vrací v registrech. A právě registry v tom podle mě dělají ten rozdíl – na linuxu se kompilátor chová tak, že registr použitý k návratu vynuluje, kdežto na Windows ne. Díky tomu v registru zůstane hodnota, která už tam byla před voláním funkce (a s největší pravděpodobností je nenulová), takže pak dostanete odpověď OK.

    Aspoň takto si to vysvětluji.

    Použití if (Testfunction()) je v pořádku. Můžete si představit, že kompilátor toto vidí jako if (Testfunction() != 0).

    odpověď na: Linux x Windows rozdíly v kompilaci? #10475
    schamann
    Účastník

    Mozna mela puvodni otazka byt jinak postavena:
    Je konstrukce if (Testfunction()) { sama o sobe spravna? neni bezpecnejsi pouzit treba jiny operator?

    odpověď na: Linux x Windows rozdíly v kompilaci? #10473
    schamann
    Účastník

    To ja vim, ze nic nevrati… Otazka byla proc to kazdy kompilator zpracuje jinak, ve win dostanu hlasku OK, a v Lin dostanu Hlasku False. Tedy, ja testuju vysledek Testfunction(), ktery je prazdny. a zajima me proc je vyhodnoceni v ruznych kompilacich ruzne. nikoli to, ze je to samo o sobe blbost.

    Mimochodem nevrati „co chce“, vrati neco co win vyhodnoti jako true tedy jakoukoliv hodnotu mimo 0 a pod linuxovou kompilaci vrati 0 protoze vysledek je FALSE. A nebo vrati NULL a pak to kazdy kompilator vyhodnoti jinak a to je to co me zajima.

    Muj asi mylny predpoklad na FALSE pochazi z Visual Studia kde programuju uz 20 let. Pokud v Basicu deklaruji funkci Boolean, je vzdy vysledek false, pokud mu neridam hodnotu true.

    odpověď na: Linux x Windows rozdíly v kompilaci? #10471
    Vojtěch Vosáhlo
    Účastník

    Jak můžete říct že správná odpověď je false? Ten kód koukne na to jestli se 1==1, řekne ano ale pak nic nevrací, tzn na return nikdy nenarazí. Může si teda vrátit co chce.
    Řešení je v celku jednoduché. Vždy používat return ve všech částech kde by jste měl. Mnoho IDE by vás to ani nenechalo zkompilovat, vyjela by hláška jako „Not all parts of the code return a value.“ Pokud nic nenastavíte, program si asi dělá trochu co chce.

    Jinak tu funkce upravená tak aby vždy něco vrátila by vapadala takto ale to asi víte.

    boolean TestFunction() {
      if (true) {
         return true;
         break;
          
     }
        return false;
    }

    Pokud to je zakomentované tak samozřejmě nevrátí nic…

    rehot79
    Účastník

    Pekné riešenie ale možno som našiel niečo jednoduchšie , bez potrebnej vedomosti o elektrotechnike aj keď ja som elektrotechnik, ale na čo si komplikovať život no nie? a cenovo dostupne na Ebay cca 3Eur. Volá sa to ssr-40da relé,je galvanicky oddelene,ovládane už od 3 volt DC .Pridávam link na YouTube
    Klik sem Pevne verím že toto pomôže veľa ľudom s touto problematikou .

    petan
    Účastník

    Mrkni sem: http://playground.arduino.cc/Main/ACPhaseControl (bacha, mají přehozeno in a out na Arduinu). Jinak, když zadáš do gůglu „AC Phase Control“ tak toho určitě najdeš dost. Je to v podstatě řízená triaková regulace.

Aktuálně je na stránce zobrazeno 30 příspěvků - 691. až 720. (celkem z 2,768)