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

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем 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; // возвращаемся в начало
      }
    }
    }
    Спасибо за внимание!
     
  10. Tomic

    Tomic Нуб

    Всем доброго времени суток! пока читал этот форум, получилось коряво объединить свои 2 скетча, вольтметр и термометр на 2-е точки, с сравнением по двум нужным пределам на пин 12 и 13, по вольтметру и термометру, только сигнал термометра не дрыгает ногой, код работает медленно, реакция пина 13 вольтметра секунды 2. Огромная просьба помочь код причесать, по блокам( термометр, вольтметр, индикация), что бы разобраться как это выглядит, и увидеть ошибку в сравнении термометра.

    Код (C++):

    // библиотеки
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(6, 7, 2, 3, 4, 5);// задаем пины lcd

    // переменные для вольтметра
    float input_volt = 0.0;
    float temp=0.0;
    float r1=10000.0; //сопротивление резистора r1
    float r2=103000.0; // сопротивление резистора r

    // линия данных подключена к цифровому выводу 2 Arduino
    #define ONE_WIRE_BUS 10

    // линия индикации сравнения
    #define led 12
    #define led_pin 13
    // настройка объекта oneWire для связи с любым устройством OneWire
    OneWire oneWire(ONE_WIRE_BUS);

    // передать ссылку на oneWire библиотеке DallasTemperature
    DallasTemperature sensors(&oneWire);

    // адреса трех датчиков DS18B20
    uint8_t sensor1[8] = { 0x28, 0x2C, 0xD4, 0xA9, 0x04, 0x00, 0x00, 0x30  };
    uint8_t sensor2[8] = { 0x28, 0xFF, 0x21, 0x15, 0x54, 0x17, 0x04, 0xC2 };
    uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };


    void setup(void)
    {
      lcd.begin(16, 2);
    // Serial.begin(9600);
      sensors.begin();
      lcd.clear();
      pinMode(13, OUTPUT);
      pinMode(12, OUTPUT);
    }

    void loop(void)
    {
      // вывод температуры на дисплей
           sensors.requestTemperatures();
      lcd.setCursor(0, 0);
      lcd.print("R:");
      printTemperature(sensor1);

      lcd.setCursor(9, 0);
     
      lcd.print("D:");
      printTemperature(sensor2);

    // чтение А0 и вывод на дисплей
    int analogvalue = analogRead(A0);
    temp = (analogvalue * 5.0) / 1024.0; // формула для конвертирования значения напряжения
    input_volt = temp / (r2/(r1+r2));
    if (input_volt < 0.1)
    {
    input_volt=0.0;
    }
    lcd.setCursor(0, 1);
    lcd.print("V= "); // выводим значение напряжения на экран ЖК дисплея
    lcd.print(input_volt);
     
        delay(200);
        }

         void printTemperature(DeviceAddress deviceAddress)
    {
         float tempC = sensors.getTempC(deviceAddress);
      lcd.print(tempC);

    // сравнение порога вольтметра и сигнал пин 13
    if (input_volt < 2) // сравнение с нижним пределом вольт
    {digitalWrite(led_pin,HIGH );}// сигнал
    else if (input_volt >4)// сравнение с верним пределом вольт
    {digitalWrite(led_pin,HIGH );}// сигнал
    else
    {digitalWrite(led_pin,LOW );} // в пределах сравнения

    // сравнение порога термометра и сигнал пин 12
    if (sensor2 < 28)// сравнение с нижним пределом терм
    {digitalWrite(led,HIGH );}// сигнал
    else if (sensor2 >31)// сравнение с верним пределом терм
    {digitalWrite(led,HIGH );}// сигнал
    else
    {digitalWrite(led,LOW );}// в пределах сравнения

    }