Помогите объединить два и более скетчей в один

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем CasperSimfer, 7 дек 2014.

  1. b707

    b707 Гуру

    вставьте коды в сообщение правильно и обьясните русским языком, чего вы хотите добиться от обьединения?
    Вообще, просить помоши с таким кодом просто стыдно, в первом отрывке всего-то три строчки - неужели нужно что-то обьединять, чтобы добавить их во второй код?
     
  2. Denet261

    Denet261 Нуб

    Всем привет) Ребята помогите мне сделать слайдер что бы картинка переключалась с помощью тачскрина
    Скину два когда.

    В этом коде работает тачскрин)

    Код (C++):
    #include <Adafruit_GFX.h>    // Core graphics library
    //#include <Adafruit_TFTLCD.h> // Hardware-specific library
    //Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);
    #include <MCUFRIEND_kbv.h>
    MCUFRIEND_kbv tft;       // hard-wired for UNO shields anyway.
    #include <TouchScreen.h>

    #if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
    #endif

    //----------------------------------------|
    // TFT Breakout  -- Arduino UNO / Mega2560 / OPEN-SMART UNO Black
    // GND              -- GND
    // 3V3               -- 3.3V
    // CS                 -- A3
    // RS                 -- A2
    // WR                -- A1
    // RD                 -- A0
    // RST                -- RESET
    // LED                -- GND
    // DB0                -- 8
    // DB1                -- 9
    // DB2                -- 10
    // DB3                -- 11
    // DB4                -- 4
    // DB5                -- 13
    // DB6                -- 6
    // DB7                -- 7
    // most mcufriend shields use these pins and Portrait mode:
    uint8_t YP = A1;  // must be an analog pin, use "An" notation!
    uint8_t XM = A2;  // must be an analog pin, use "An" notation!
    uint8_t YM = 7;   // can be a digital pin
    uint8_t XP = 6;   // can be a digital pin
    uint8_t SwapXY = 0;

    uint16_t TS_LEFT = 880;
    uint16_t TS_RT  = 170;
    uint16_t TS_TOP = 950;
    uint16_t TS_BOT = 180;
    char *name = "Unknown controller";

    // For better pressure precision, we need to know the resistance
    // between X+ and X- Use any multimeter to read it
    // For the one we're using, its 260 ohms across the X plate
    TouchScreen ts = TouchScreen(XP, YP, XM, YM, 260);
    TSPoint tp;

    #define MINPRESSURE 20
    #define MAXPRESSURE 1000

    #define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;}

    int16_t BOXSIZE;
    int16_t PENRADIUS = 3;
    uint16_t identifier, oldcolor, currentcolor;
    uint8_t Orientation = 2;    //PORTRAIT

    // Assign human-readable names to some common 16-bit color values:
    #define BLACK   0x0000
    #define BLUE    0x001F
    #define RED     0xF800
    #define GREEN   0x07E0
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define WHITE   0xFFFF

    void show_Serial(void)
    {
        Serial.print(F("Found "));
        Serial.print(name);
        Serial.println(F(" LCD driver"));
        Serial.print(F("ID=0x"));
        Serial.println(identifier, HEX);
        Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height()));
        Serial.println("Calibration is: ");
        Serial.println("LEFT = " + String(TS_LEFT) + " RT  = " + String(TS_RT));
        Serial.println("TOP  = " + String(TS_TOP)  + " BOT = " + String(TS_BOT));
        Serial.print("Wiring is: ");
        Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT");
        Serial.println("YP=" + String(YP)  + " XM=" + String(XM));
        Serial.println("YM=" + String(YM)  + " XP=" + String(XP));
    }

    void show_tft(void)
    {
        tft.setCursor(0, 0);
        tft.setTextSize(2);
        tft.print(F("Found "));
        tft.print(name);
        tft.println(F(" LCD"));
        tft.setTextSize(1);
        tft.print(F("ID=0x"));
        tft.println(identifier, HEX);
        tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height()));
        tft.println("Calibration is: ");
        tft.println("LEFT = " + String(TS_LEFT) + " RT  = " + String(TS_RT));
        tft.println("TOP  = " + String(TS_TOP)  + " BOT = " + String(TS_BOT));
        tft.print("\nWiring is: ");
        if (SwapXY) {
            tft.setTextColor(CYAN);
            tft.setTextSize(2);
        }
        tft.println(SwapXY ? "SWAPXY" : "PORTRAIT");
        tft.println("YP=" + String(YP)  + " XM=" + String(XM));
        tft.println("YM=" + String(YM)  + " XP=" + String(XP));
        tft.setTextSize(2);
        tft.setTextColor(RED);
        tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4);
        tft.print("EXIT");
        tft.setTextColor(YELLOW, BLACK);
        tft.setCursor(0, (tft.height() * 6) / 8);
        tft.print("Touch screen for loc");
        while (1) {
            tp = ts.getPoint();
            pinMode(XM, OUTPUT);
            pinMode(YP, OUTPUT);
            pinMode(XP, OUTPUT);
            pinMode(YM, OUTPUT);
            if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue;
            if (tp.x > 450 && tp.x < 570  && tp.y > 450 && tp.y < 570) break;
            tft.setCursor(0, (tft.height() * 3) / 4);
            tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + "   ");
        }
    }


    void setup(void)
    {
        uint16_t tmp;
        tft.begin(9600);
     
        tft.reset();
        identifier = tft.readID();
        switch (Orientation) {      // adjust for different aspects
            case 0:   break;        //no change,  calibrated for PORTRAIT
            case 1:   tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp;  break;
            case 2:   SWAP(TS_LEFT, TS_RT);  SWAP(TS_TOP, TS_BOT); break;
            case 3:   tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp;  break;
        }

        Serial.begin(9600);
        ts = TouchScreen(XP, YP, XM, YM, 260);     //call the constructor AGAIN with new values.
        tft.begin(0x65);//to enable HX8352B driver code
        show_Serial();
        tft.setRotation(Orientation);
        tft.fillScreen(BLACK);
        show_tft();

        BOXSIZE = tft.width() / 6;
        tft.fillScreen(BLACK);

        tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
        tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
        tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
        tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
        tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
        tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);

        tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
        currentcolor = RED;
        delay(1000);
    }

    void loop()
    {
        uint16_t xpos, ypos;  //screen coordinates
        tp = ts.getPoint();   //tp.x, tp.y are ADC values

        // if sharing pins, you'll need to fix the directions of the touchscreen pins
        pinMode(XM, OUTPUT);
        pinMode(YP, OUTPUT);
        pinMode(XP, OUTPUT);
        pinMode(YM, OUTPUT);
        //    digitalWrite(XM, HIGH);
        //    digitalWrite(YP, HIGH);
        // we have some minimum pressure we consider 'valid'
        // pressure of 0 means no pressing!

        if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) {
            // is controller wired for Landscape ? or are we oriented in Landscape?
            if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y);
            // scale from 0->1023 to tft.width  i.e. left = 0, rt = width
            // most mcufriend have touch (with icons) that extends below the TFT
            // screens without icons need to reserve a space for "erase"
            // scale the ADC values from ts.getPoint() to screen values e.g. 0-239
            xpos = map(tp.x, TS_LEFT, TS_RT, tft.width(), 0);
            ypos = map(tp.y, TS_TOP, TS_BOT, tft.height(), 0);

            // are we in top color box area ?
            if (ypos < BOXSIZE) {               //draw white border on selected color box
                oldcolor = currentcolor;

                if (xpos < BOXSIZE) {
                    currentcolor = RED;
                    tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
                } else if (xpos < BOXSIZE * 2) {
                    currentcolor = YELLOW;
                    tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);
                } else if (xpos < BOXSIZE * 3) {
                    currentcolor = GREEN;
                    tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE);
                } else if (xpos < BOXSIZE * 4) {
                    currentcolor = CYAN;
                    tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE);
                } else if (xpos < BOXSIZE * 5) {
                    currentcolor = BLUE;
                    tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE);
                } else if (xpos < BOXSIZE * 6) {
                    currentcolor = MAGENTA;
                    tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE);
                }

                if (oldcolor != currentcolor) { //rub out the previous white border
                    if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
                    if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
                    if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
                    if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
                    if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
                    if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);
                }
            }
            // are we in drawing area ?
            if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) {
                tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor);
            }
            // are we in erase area ?
            if (ypos > tft.height() - 10) {
                // press the bottom of the screen to erase
                tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK);
            }
        }
    }
     
  3. Denet261

    Denet261 Нуб

    В этом коде картинки переключаются по таймеру, а нужно что бы при прикосновении тачскрине
    Код (C++):
    В этом коде переключаются картинки по времени)
    [code=cpp]#include <SPI.h>          // f.k. for Arduino-1.5.2
    //#define USE_SDFAT
    #include <SD.h>
    //#include <SdFat.h>           // Use the SdFat library
    //SdFat SD;                    // Use hardware SPI (or UNO with SD_SPI_CONFIGURATION==2)
    //SdFatSoftSpi<12, 11, 13> SD; //Bit-Bang SD_SPI_CONFIGURATION==3

    #include <Adafruit_GFX.h> // Hardware-specific library

    #include <MCUFRIEND_kbv.h>

    //----------------------------------------|
    // TFT Breakout  -- Arduino UNO / Mega2560 / OPEN-SMART UNO Black
    // GND              -- GND
    // 3V3               -- 3.3V
    // CS                 -- A3
    // RS                 -- A2
    // WR                -- A1
    // RD                 -- A0
    // RST                -- RESET
    // LED                -- GND
    // DB0                -- 8
    // DB1                -- 9
    // DB2                -- 10
    // DB3                -- 11
    // DB4                -- 4
    // DB5                -- 13
    // DB6                -- 6
    // DB7                -- 7
    MCUFRIEND_kbv tft;
    #define SD_CS 5

    File root;
    char namebuf[32] = "girl.bmp";
    int pathlen;
    uint8_t         spi_save;

    void setup()
    {
        uint16_t ID;
        Serial.begin(9600);
        Serial.print("Show BMP files on TFT with ID:0x");
        ID = tft.readID();
        Serial.println(ID, HEX);
        if (ID == 0x0D3D3) ID = 0x9481;
        tft.begin(0x65);//to enable HX8352B driver code
        tft.fillScreen(0x0000);
      /*  if (tft.height() > tft.width()) tft.setRotation(1);    //LANDSCAPE
        tft.setTextColor(0xFFFF, 0x0000);*/

        bool good = SD.begin(SD_CS);
        if (!good) {
            Serial.print(F("cannot start SD"));
            while (1);
        }
    }
    void loop()
    {
       tft.flag_write_bmp = 1;
       tft.setRotation(0);
       bmpDraw("01.bmp", 0, 0);//
       tft.flag_write_bmp = 0;
       delay(1000);
       tft.fillScreen(0x0000);
     
       tft.flag_write_bmp = 1;
       tft.setRotation(0);
       bmpDraw("02.bmp", 0, 0);//show a beautiful girl photo in the folder \libraries\OPENSMART_TFT\bitmaps
       tft.flag_write_bmp = 0;
       delay(1000);
       tft.fillScreen(0x0000);
     
       tft.flag_write_bmp = 1;
       tft.setRotation(0);
       bmpDraw("03.bmp", 0, 0);//show a beautiful girl photo in the folder \libraries\OPENSMART_TFT\bitmaps
       tft.flag_write_bmp = 0;
       delay(1000);
       tft.fillScreen(0x0000);
    /*  for(int i = 0; i<4; i++) {
           tft.fillScreen(0);
         tft.setRotation(i);
       
         for(int j=0; j <= 200; j += 50) {
           bmpDraw("miniwoof.bmp", j, j);
         }
         delay(1000);
       }*/

    }
    // This function opens a Windows Bitmap (BMP) file and
    // displays it at the given coordinates.  It's sped up
    // by reading many pixels worth of data at a time
    // (rather than pixel by pixel).  Increasing the buffer
    // size takes more of the Arduino's precious RAM but
    // makes loading a little faster.    20 pixels seems a
    // good balance.
    #define BUFFPIXEL 20
    void bmpDraw(char *filename, int x, int y) {
       File     bmpFile;
       int        bmpWidth, bmpHeight;   // W+H in pixels
       uint8_t    bmpDepth;               // Bit depth (currently must be 24)
       uint32_t bmpImageoffset;        // Start of image data in file
       uint32_t rowSize;               // Not always = bmpWidth; may have padding
       uint8_t    sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
       uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)
       uint8_t    buffidx = sizeof(sdbuffer); // Current position in sdbuffer
       boolean    goodBmp = false;       // Set to true on valid header parse
       boolean    flip    = true;        // BMP is stored bottom-to-top
       int        w, h, row, col;
       uint8_t    r, g, b;
       uint32_t pos = 0, startTime = millis();
       uint8_t    lcdidx = 0;
       boolean    first = true;
       if((x >= tft.width()) || (y >= tft.height())) return;
       Serial.println();
       Serial.print("Loading image '");
       Serial.print(filename);
       Serial.println('\'');
       // Open requested file on SD card
       SPCR = spi_save;
       if ((bmpFile = SD.open(filename)) == NULL) {
         Serial.print("File not found");
         return;
       }
       // Parse BMP header
       if(read16(bmpFile) == 0x4D42) { // BMP signature
         Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
         (void)read32(bmpFile); // Read & ignore creator bytes
         bmpImageoffset = read32(bmpFile); // Start of image data
         Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
         // Read DIB header
         Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
         bmpWidth  = read32(bmpFile);
         bmpHeight = read32(bmpFile);
         if(read16(bmpFile) == 1) { // # planes -- must be '1'
           bmpDepth = read16(bmpFile); // bits per pixel
           Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
           if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
             goodBmp = true; // Supported BMP format -- proceed!
             Serial.print(F("Image size: "));
             Serial.print(bmpWidth);
             Serial.print('x');
             Serial.println(bmpHeight);
             // BMP rows are padded (if needed) to 4-byte boundary
             rowSize = (bmpWidth * 3 + 3) & ~3;
             // If bmpHeight is negative, image is in top-down order.
             // This is not canon but has been observed in the wild.
             if(bmpHeight < 0) {
               bmpHeight = -bmpHeight;
               flip      = false;
             }
             // Crop area to be loaded
             w = bmpWidth;
             h = bmpHeight;
             if((x+w-1) >= tft.width())  w = tft.width()  - x;
             if((y+h-1) >= tft.height()) h = tft.height() - y;
             // Set TFT address window to clipped image bounds
             SPCR = 0;
             tft.setAddrWindow(x, y, x+w-1, y+h-1);
             for (row=0; row<h; row++) { // For each scanline...
               // Seek to start of scan line.  It might seem labor-
               // intensive to be doing this on every line, but this
               // method covers a lot of gritty details like cropping
               // and scanline padding.  Also, the seek only takes
               // place if the file position actually needs to change
               // (avoids a lot of cluster math in SD library).
               if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
                 pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
               else     // Bitmap is stored top-to-bottom
                 pos = bmpImageoffset + row * rowSize;
               SPCR = spi_save;
               if(bmpFile.position() != pos) { // Need seek?
                 bmpFile.seek(pos);
                 buffidx = sizeof(sdbuffer); // Force buffer reload
               }
               for (col=0; col<w; col++) { // For each column...
                 // Time to read more pixel data?
                 if (buffidx >= sizeof(sdbuffer)) { // Indeed
                   // Push LCD buffer to the display first
                   if(lcdidx > 0) {
                     SPCR    = 0;
                     tft.pushColors(lcdbuffer, lcdidx, first);
                     lcdidx = 0;
                     first    = false;
                   }
                   SPCR = spi_save;
                   bmpFile.read(sdbuffer, sizeof(sdbuffer));
                   buffidx = 0; // Set index to beginning
                 }
                 // Convert pixel from BMP to TFT format
                 b = sdbuffer[buffidx++];
                 g = sdbuffer[buffidx++];
                 r = sdbuffer[buffidx++];
                 lcdbuffer[lcdidx++] = tft.color565(r,g,b);
               } // end pixel
             } // end scanline
             // Write any remaining data to LCD
             if(lcdidx > 0) {
               SPCR = 0;
               tft.pushColors(lcdbuffer, lcdidx, first);
             }
             Serial.print(F("Loaded in "));
             Serial.print(millis() - startTime);
             Serial.println(" ms");
           } // end goodBmp
         }
       }
       bmpFile.close();
       if(!goodBmp) Serial.println("BMP format not recognized.");
    }
    // These read 16- and 32-bit types from the SD card file.
    // BMP data is stored little-endian, Arduino is little-endian too.
    // May need to reverse subscript order if porting elsewhere.
    uint16_t read16(File f) {
       uint16_t result;
       ((uint8_t *)&result)[0] = f.read(); // LSB
       ((uint8_t *)&result)[1] = f.read(); // MSB
       return result;
    }
    uint32_t read32(File f) {
       uint32_t result;
       ((uint8_t *)&result)[0] = f.read(); // LSB
       ((uint8_t *)&result)[1] = f.read();
       ((uint8_t *)&result)[2] = f.read();
       ((uint8_t *)&result)[3] = f.read(); // MSB
       return result;
    }
     
    [/code]
     
  4. Tatarchenok

    Tatarchenok Нуб

    Всем доброго дня!
    Начал ломать ардуинку. Нашел у вас здесь скетч на одну кнопку два диода
    // Таймер после которого светодиоды гаснут
    #define TIME_LED_OFF 3000 // 3 сек
    unsignedlongint time_led_off;
    // Таймер для антидребезга кнопки, его можно поставить меньше, но не суть
    #define TIME_BUTTON 100 // 100 мс
    unsignedlongint time_button;

    int state;
    int val;// флаг для однократного выполнения действия

    void setup()
    {
    pinMode(12, OUTPUT);// светодиод 1
    pinMode(13, OUTPUT);// светодиод 2
    pinMode(11, INPUT);// кнопка
    }

    void loop()
    {
    // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
    if(millis()- time_button > TIME_BUTTON)
    {
    // Нажимаем кнопку
    if(digitalRead(11)== HIGH)
    {
    // Если нажали кнопку, то выполним только одно действие
    if(val !=1)// если val НЕ равна 1, а изначально она 0, то
    {
    state +=1;// выполняем какие-то действия
    // сбрасываем таймер для светодиодов
    time_led_off = millis();
    val =1;// присваиваем переменной val =1, что не даст циклу выполнится многократно
    }
    }
    else
    {
    // выполнять другие действия мы можем, только после того,
    // как кнопка была отпущена (digitalRead(11) == LOW)
    val =0;
    time_button = millis();// сбросим таймер антидребезга кнопки
    }
    }
    // дальше по порядку
    // первое нажатие включает светодиод 1
    if(state ==1)
    {
    digitalWrite(12, HIGH);
    // выключает по таймеру
    if(millis()- time_led_off > TIME_LED_OFF)
    {
    digitalWrite(12, LOW);
    state =2;
    }
    }
    // второе нажатие - досрочно выключает первый светодиод
    if(state ==2)
    {
    digitalWrite(12, LOW);
    }
    // третье нажатие включает второй светик
    if(state ==3)
    {
    digitalWrite(13, HIGH);
    // отключает его по таймеру
    if(millis()- time_led_off > TIME_LED_OFF)
    {
    digitalWrite(13, LOW);
    state =0;
    }
    }
    // четвертое нажатие отключает светик досрочно
    if(state ==4)
    {
    digitalWrite(13, LOW);
    state =0;// возвращаемся в начало
    }
    }

    Мне нужно склеить его с таким же чтобы было две кнопки четыре диода и одна кнопка управляет своей парой диодов а вторая кнопка своей парой
    И так как я только начинающий получилась полная хрень

    // Таймер после которого светодиоды гаснут
    #define TIME_LED_OFF 3000 // 3 сек
    unsigned long int time_led_off;
    // Таймер для антидребезга кнопки, его можно поставить меньше, но не суть
    #define TIME_BUTTON 100 // 100 мс
    unsigned long int time_button;

    int state;
    int val; // флаг для однократного выполнения действия

    void setup()
    {
    pinMode(5, OUTPUT); // светодиод 1
    pinMode(6, OUTPUT); // светодиод 2
    pinMode(2, INPUT); // кнопка 1
    pinMode(7, OUTPUT); // светодиод 3
    pinMode(8, OUTPUT); // светодиод 4
    pinMode(3, INPUT); // кнопка 2
    }

    void loop()
    {
    {
    // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
    if (millis() - time_button > TIME_BUTTON)
    {
    // Нажимаем кнопку
    if (digitalRead(2) == HIGH)
    {
    // Если нажали кнопку, то выполним только одно действие
    if (val != 1) // если val НЕ равна 1, а изначально она 0, то
    {
    state += 1; // выполняем какие-то действия
    // сбрасываем таймер для светодиодов
    time_led_off = millis();
    val = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
    }
    }
    else
    {
    // выполнять другие действия мы можем, только после того,
    // как кнопка была отпущена (digitalRead(11) == LOW)
    val = 0;
    time_button = millis(); // сбросим таймер антидребезга кнопки
    }
    }
    // дальше по порядку
    // первое нажатие включает светодиод 1
    if (state == 1)
    {
    digitalWrite(5, HIGH);
    // выключает по таймеру
    if (millis() - time_led_off > TIME_LED_OFF)
    {
    digitalWrite(5, LOW);
    state = 2;
    }
    }
    // второе нажатие - досрочно выключает первый светодиод
    if (state == 2)
    {
    digitalWrite(5, LOW);
    }
    // третье нажатие включает второй светик
    if (state == 3)
    {
    digitalWrite(6, HIGH);
    // отключает его по таймеру
    if (millis() - time_led_off > TIME_LED_OFF)
    {
    digitalWrite(6, LOW);
    state = 0;
    }
    }
    // четвертое нажатие отключает светик досрочно
    if (state == 4)
    {
    digitalWrite(6, LOW);
    state = 0; // возвращаемся в начало
    }
    }
    {
    // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
    if (millis() - time_button > TIME_BUTTON)
    {
    // Нажимаем кнопку
    if (digitalRead(3) == HIGH)
    {
    // Если нажали кнопку, то выполним только одно действие
    if (val != 1) // если val НЕ равна 1, а изначально она 0, то
    {
    state += 1; // выполняем какие-то действия
    // сбрасываем таймер для светодиодов
    time_led_off = millis();
    val = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
    }
    }
    else
    {
    // выполнять другие действия мы можем, только после того,
    // как кнопка была отпущена (digitalRead(11) == LOW)
    val = 0;
    time_button = millis(); // сбросим таймер антидребезга кнопки
    }
    }
    // дальше по порядку
    // первое нажатие включает светодиод 1
    if (state == 1)
    {
    digitalWrite(7, HIGH);
    // выключает по таймеру
    if (millis() - time_led_off > TIME_LED_OFF)
    {
    digitalWrite(7, LOW);
    state = 2;
    }
    }
    // второе нажатие - досрочно выключает первый светодиод
    if (state == 2)
    {
    digitalWrite(7, LOW);
    }
    // третье нажатие включает второй светик
    if (state == 3)
    {
    digitalWrite(8, HIGH);
    // отключает его по таймеру
    if (millis() - time_led_off > TIME_LED_OFF)
    {
    digitalWrite(8, LOW);
    state = 0;
    }
    }
    // четвертое нажатие отключает светик досрочно
    if (state == 4)
    {
    digitalWrite(8, LOW);
    state = 0; // возвращаемся в начало
    }
    }
    }
    кнопки переключают все диоды и не по порядку. Помогите пожалуйста!??
     
  5. Tatarchenok

    Tatarchenok Нуб

    Входы/выходы я поменял под себя.
     
  6. b707

    b707 Гуру

    Tatarchenok - вставьте код в сообщение правильно

    PS - это не гарантия. что кто-то бросится вам помогать, но без этого точно никто помогать не станет
     
  7. Tatarchenok

    Tatarchenok Нуб

    Код (C++):
    // Таймер после которого светодиоды гаснут
    #define TIME_LED_OFF 3000    // 3 сек
    unsigned long int time_led_off;
    // Таймер для антидребезга кнопки, его можно поставить меньше, но не суть
    #define TIME_BUTTON 100    // 100 мс
    unsigned long int time_button;

    int state;
    int val; // флаг для однократного выполнения действия

    void setup()
    {
      pinMode(5, OUTPUT); // светодиод 1
      pinMode(6, OUTPUT); // светодиод 2
      pinMode(2, INPUT);  // кнопка 1
      pinMode(7, OUTPUT); // светодиод 3
      pinMode(8, OUTPUT); // светодиод 4
      pinMode(3, INPUT);  // кнопка 2
    }

    void loop()
    {
    {
      // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
      if (millis() - time_button > TIME_BUTTON)
      {
        // Нажимаем кнопку
        if (digitalRead(2) == HIGH)
        {
          // Если нажали кнопку, то выполним только одно действие
          if (val != 1) // если val НЕ равна 1, а изначально она 0, то
          {
            state += 1; // выполняем какие-то действия
            // сбрасываем таймер для светодиодов
            time_led_off = millis();
            val = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
          }
        }
        else
        {
          // выполнять другие действия мы можем, только после того,
          // как кнопка была отпущена (digitalRead(11) == LOW)
          val = 0;
          time_button = millis(); // сбросим таймер антидребезга кнопки
        }
      }
      // дальше по порядку
      // первое нажатие включает светодиод 1
      if (state == 1)
      {
        digitalWrite(5, HIGH);
        // выключает по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(5, LOW);
          state = 2;
        }
      }
      // второе нажатие - досрочно выключает первый светодиод
      if (state == 2)
      {
        digitalWrite(5, LOW);
      }
      // третье нажатие включает второй светик
      if (state == 3)
      {
        digitalWrite(6, HIGH);
        // отключает его по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(6, LOW);
          state = 0;
        }
      }
      // четвертое нажатие отключает светик досрочно
      if (state == 4)
      {
        digitalWrite(6, LOW);
        state = 0; // возвращаемся в начало
      }
    }
    {
      // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
      if (millis() - time_button > TIME_BUTTON)
      {
        // Нажимаем кнопку
        if (digitalRead(3) == HIGH)
        {
          // Если нажали кнопку, то выполним только одно действие
          if (val != 1) // если val НЕ равна 1, а изначально она 0, то
          {
            state += 1; // выполняем какие-то действия
            // сбрасываем таймер для светодиодов
            time_led_off = millis();
            val = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
          }
        }
        else
        {
          // выполнять другие действия мы можем, только после того,
          // как кнопка была отпущена (digitalRead(11) == LOW)
          val = 0;
          time_button = millis(); // сбросим таймер антидребезга кнопки
        }
      }
      // дальше по порядку
      // первое нажатие включает светодиод 1
      if (state == 1)
      {
        digitalWrite(7, HIGH);
        // выключает по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(7, LOW);
          state = 2;
        }
      }
      // второе нажатие - досрочно выключает первый светодиод
      if (state == 2)
      {
        digitalWrite(7, LOW);
      }
      // третье нажатие включает второй светик
      if (state == 3)
      {
        digitalWrite(8, HIGH);
        // отключает его по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(8, LOW);
          state = 0;
        }
      }
      // четвертое нажатие отключает светик досрочно
      if (state == 4)
      {
        digitalWrite(8, LOW);
        state = 0; // возвращаемся в начало
      }
    }
    }
     
  8. Tatarchenok

    Tatarchenok Нуб

    Прошу прощения за не корректно сформулированный вопрос.
     
  9. Tatarchenok

    Tatarchenok Нуб

    И снова здравствуйте!
    Сложил я все таки два скетча, может корявенько получилось но работает как я и хотел...
    Господа профессионалы поправьте если чего лишнего накидал туда...
    Код (C++):
    // Таймер после которого светодиоды гаснут
    #define TIME_LED_OFF 3000    // 3 сек
    unsigned long int time_led_off;
    // Таймер для антидребезга кнопки, его можно поставить меньше, но не суть
    #define TIME_BUTTON 100    // 100 мс
    unsigned long int time_button;

    int state1;
    int state2;
    int val1; // флаг для однократного выполнения действия
    int val2;

    void setup()
    {
      pinMode(5, OUTPUT); // светодиод 1
      pinMode(6, OUTPUT); // светодиод 2
      pinMode(2, INPUT);  // кнопка 1
      pinMode(7, OUTPUT); // светодиод 3
      pinMode(8, OUTPUT); // светодиод 4
      pinMode(3, INPUT);  // кнопка 2
    }

    void loop()
    {
      {
      // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
      if (millis() - time_button > TIME_BUTTON)
      {
        // Нажимаем кнопку
        if (digitalRead(2) == HIGH)
        {
          // Если нажали кнопку, то выполним только одно действие
          if (val1 != 1) // если val НЕ равна 1, а изначально она 0, то
          {
            state1 += 1; // выполняем какие-то действия
            // сбрасываем таймер для светодиодов
            time_led_off = millis();
            val1 = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
          }
        }
        else
        {
          // выполнять другие действия мы можем, только после того,
          // как кнопка была отпущена (digitalRead(11) == LOW)
          val1 = 0;
          time_button = millis(); // сбросим таймер антидребезга кнопки
        }
      }
      // дальше по порядку
      // первое нажатие включает светодиод 1
      if (state1 == 1)
      {
        digitalWrite(5, HIGH);
        // выключает по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(5, LOW);
          state1 = 2;
        }
      }
      // второе нажатие - досрочно выключает первый светодиод
      if (state1 == 2)
      {
        digitalWrite(5, LOW);
      }
      // третье нажатие включает второй светик
      if (state1 == 3)
      {
        digitalWrite(6, HIGH);
        // отключает его по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(6, LOW);
          state1 = 0;
        }
      }
      // четвертое нажатие отключает светик досрочно
      if (state1 == 4)
      {
        digitalWrite(6, LOW);
        state1 = 0; // возвращаемся в начало
      }
    }
    {
      // Нажимаем кнопку и считываем состояние кнопки только после 100 мс, когда дребезг контактов кнопки устаканился
      if (millis() - time_button > TIME_BUTTON)
      {
        // Нажимаем кнопку
        if (digitalRead(3) == HIGH)
        {
          // Если нажали кнопку, то выполним только одно действие
          if (val2 != 1) // если val НЕ равна 1, а изначально она 0, то
          {
            state2 += 1; // выполняем какие-то действия
            // сбрасываем таймер для светодиодов
            time_led_off = millis();
            val2 = 1; // присваиваем переменной val =1, что не даст циклу выполнится многократно
          }
        }
        else
        {
          // выполнять другие действия мы можем, только после того,
          // как кнопка была отпущена (digitalRead(11) == LOW)
          val2 = 0;
          time_button = millis(); // сбросим таймер антидребезга кнопки
        }
      }
      // дальше по порядку
      // первое нажатие включает светодиод 1
      if (state2 == 1)
      {
        digitalWrite(7, HIGH);
        // выключает по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(7, LOW);
          state2 = 2;
        }
      }
      // второе нажатие - досрочно выключает первый светодиод
      if (state2 == 2)
      {
        digitalWrite(7, LOW);
      }
      // третье нажатие включает второй светик
      if (state2 == 3)
      {
        digitalWrite(8, HIGH);
        // отключает его по таймеру
        if (millis() - time_led_off > TIME_LED_OFF)
        {
          digitalWrite(8, LOW);
          state2 = 0;
        }
      }
      // четвертое нажатие отключает светик досрочно
      if (state2 == 4)
      {
        digitalWrite(8, LOW);
        state2 = 0; // возвращаемся в начало
      }
    }
    }
    Спасибо за внимание!