728x90
    Dim lastrow As Long
    Dim lngE As Long
    Dim rngD As Range
    Dim i As Long
    
    
    Dim j As Long
    Dim Data As Long
    Dim xLastRow As Long
    
    
    Dim RealDataLastRow As Long

    Dim DeletedWantedRow As Long

    Dim LastLoopIndex As Long
    
    Dim co As Long
    Dim incRow As Long
    
    Dim k As Long
    Dim LastDateTime As Long
    
    
     Dim xWs As Worksheet


    lastrow = Sheets("20210421").Cells(Rows.Count, "F").End(xlUp).Row
    Sheets("20210421").Range("F2:F" & lastrow).AdvancedFilter _
        Action:=xlFilterCopy, _
        CopyToRange:=Sheets("Sheet1").Range("B5"), _
        Unique:=True
    'DIstinct Part
    
  

     'Dintct 된 데이터 갯수만큼의 전처리시트가 필요
    
    xLastRow = Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row - 4
    ' 6 제대로 나왔음 -> 데이터의 총 갯수
    
    
    For j = 1 To xLastRow
        ' 1 2 3 4 5 6
        
        lngE = Sheets("20210421").Cells(Rows.Count, "F").End(xlUp).Row
        
        For i = 2 To lngE
            If Sheets("20210421").Range("F" & i).Value = Sheets("Sheet1").Range("B" & (4 + j)).Value Then
                If rngD Is Nothing Then
                    Set rngD = Sheets("20210421").Range("F" & i).Offset(0, -5).Resize(1, 6)
                Else
                    Set rngD = Union(rngD, Sheets("20210421").Range("F" & i).Offset(0, -5).Resize(1, 6))
                End If
            End If
        Next
    
        If rngD Is Nothing Then
            MsgBox "복사할 범위가 없습니다."
        Else
            Sheets.Add after:=Sheets(2 + j)
            Sheets(3 + j).Range("A1").CurrentRegion.Offset(1, 0).Clear
            rngD.Copy Sheets(3 + j).Range("A1")
        End If
    
        '시트를 추가하고 데이터 사전 전처리
    
        co = Sheets(3 + j).Range("F1").CurrentRegion.Rows.Count
        
        For incRow = 0 To co
            If Sheets("Sheet1").Range("B" & (4 + j)).Value <> Sheets(3 + j).Cells(1, "F").Offset(0, 0).Value Then
            '시트와 데이터를 비교
                Sheets(3 + j).Range("F1").Select
                Selection.EntireRow.Delete
            End If
        Next
        
        '데이터 사전가공 완료
                     
    Next
    
    
    
    
    For k = 1 To xLastRow
    
        LastDateTime = Sheets(3 + k).Cells(Rows.Count, "B").End(xlUp).Row
    
        '모든 시트의 D1에는 데이터가 있음
        Sheets(3 + k).Activate
        Range("D1").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        ' 카피부
        Sheets("Sheet1").Activate
        Cells(5, "E").Offset(k - 1, 0).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
            
        Sheets("Sheet1").Cells(4 + k, "C").Offset(0, 0).Value = Sheets(3 + k).Range("B1").Value
        Sheets("Sheet1").Cells(4 + k, "D").Offset(0, 0).Value = Sheets(3 + k).Range("B" & LastDateTime).Value
    Next
    
    
    
    '마무리 처리
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    For Each xWs In Application.ActiveWorkbook.Worksheets
        If xWs.Name <> "Sheet1" And xWs.Name <> "20210421" And xWs.Name <> "Sheet2" Then 'Sheet1 과 남길시트이름 두개만 남기고 모두 삭제됨
            xWs.Delete
        End If
    Next

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    Sheets("Sheet1").Activate

'VBA' 카테고리의 다른 글

[VBA] Specific Data Distraction  (0) 2021.04.23
[VBA] last Data Cell Searching  (0) 2021.04.23
[VBA] Sheet.Add and Sheet.Delete Method  (0) 2021.04.23
[VBA] Specific Data Deleting  (0) 2021.04.23
Sheet Deleting except specific sheet  (0) 2021.04.23
728x90

OLED 디스플레이 사용을 위해 필요한 라이브러리와 소스코드를 정리했습니다. 먼저 확인해야 할 것은 OLED 디스플레이의 드라이버 칩입니다. 드라이버 칩에 따라 라이브러리와 사용방법이 완전히 틀려집니다.

 

Adafruit 그래픽 라이브러리 (SSD 1306 및 일부 TFT LCD 등…)

일반적으로 많이 사용.  Adafruit 에서 제작한 라이브러리를 사용하거나 좀 더 원시적인 코드로 구동이 가능합니다. Adafruit 라이브러리는 각종 도형 및 폰트, 선, 채우기 함수를 제공하는 대신 그래픽 버퍼로 램을 꽤 많이 잡아 먹습니다.  아두이노가 보통 2KByte 램으로 돌아간다는 점을 생각하면 램이 부족한 경우가 생길 수 있습니다. 램이 부족할 경우 각종 변수값이 이상하게 입력되고 화면이 찢어지는(?) 현상이 발생합니다.

Adafruit 라이브러리는 2개로 구성되어 있습니다. GFX 라이브러리가 공통된 drawing 함수를 제공하고, 드라이버 칩에 따라 적절하게 동작하도록 드라이버 라이브러리가 맞물리도록 되어 있습니다.

==> OLED + Adafruit 라이브러리 사용방법 페이지

Adafruit OLED 모듈 및 라이브러리 사용법, Adafruit 라이브러리와 호환 가능한 디스플레이 및 드라이버 칩

SSD1306 칩 드라이버 직접 제어하는 방법 예제코드

 

u8glib 범용 그래픽 라이브러리

SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, T6963 등을 지원하는 범용 그래픽 드라이버로 u8glib 라이브러리가 있습니다. 8비트 마이크로 컨트롤러에서 사용할 수 있는 가장 막강한 라이브러리입니다. 화면 업데이트가 조금 느린대신 램을 적게 차지하고 안정적입니다.

==> 상세한 사용법 매뉴얼이 업데이트 되었습니다!! 링크로 확인하세요.

라이브러리 공식 페이지지원하는 디바이스 목록, 매뉴얼 및 예제 코드

 

 Character LCD, MGLCD, UTFT 라이브러리

위에서 적합한 라이브러리가 없는 경우 아래 링크를 확인하세요. 각종 LCD 및 UTFT 를 지원하는 라이브러리입니다.

http://www.henningkarlsen.com/electronics/library.php?id=51

 

GLCD 라이브러리

흔한건 아니지만.. KS0108 controller chip 기반한 LCD는 아래 링크로…

http://www.pjrc.com/teensy/td_libs_GLCD.html

OpenGLCD 라이브러리 프로젝트가 있습니다. 여기 라이브러리 주목할만 합니다.

https://bitbucket.org/bperrybap/openglcd/wiki/Home

 

SH1106 라이브러리

SSD1306과 비슷하지만 별도의 라이브러리가 필요한 것 같습니다. 아래 링크를 참고하세요.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=1150108

아래 라이브러리가 쓸만하다고 하네요.

https://github.com/stanleyhuangyc/MultiLCD

Wonho 님 께서 SH1106 칩셋용 Adafruit 라이브러리를 만들어서 공유중입니다. 아래 링크에 가시면 라이브러리를 받으실 수 있습니다.

https://github.com/wonho-maker/Adafruit_SH1106

 

wonho-maker/Adafruit_SH1106

Adafruit graphic library for SH1106 dirver lcds. Contribute to wonho-maker/Adafruit_SH1106 development by creating an account on GitHub.

github.com

 

 

그래픽 램의 용량 (2K) 때문에 Library 들 간에 Collision 으로 보이는 현상들이 발생했다.

Compatiblity Check 를 해본 결과

 

LiquidCrystal 과 Adafruit 간에 문제가 있는 것으로 생각을 했는데

LiquidCrystal_i2C는 LiquidCrystal을 SPI 용도로 제작한 것에서 i2c 방식으로 포팅을 해서 만든 개수 라이브러리 였고

사실상 Adafruit LiquidCrystal 을 기반해서 만들어졌기 때문에 별 문제가 없었던 것이다.

 

오히려 문제가 됬었던 것은 TM1637 FND Library 였는데 

내부 클래스에서 선언하는 방식과 사용하는 방식이 굉장히 비슷한 데다가 

 

일반적인 example 들이 display 로 생성자를 이용하여 사용하는 것을 볼 때, 메모리 간에 근접문제가 있었던 것이 아닌가 싶다.

 

일단 중요한 것은, 반드시 필요없는 라이브러리나 헤더를 추가하지 않는 것에 유의를 해야할 것 같다.

(특히나 용량이 60~70% 이상으로 올라가면 안정성이 떨어져 제대로 동작하지 않을 가능성이 추가적으로 늘어난다.)

 

728x90

 

 

charAt()

charAt 은 문자열에서 인자로 주어진 값에 해당하는 문자를 리턴합니다.

 

문법

JAVASCRIPT

charAt(index)

Copy

 

인자

  • index - 필수
  • 0보다 큰 정수

 

 

설명(description)

문자열에 속하는 문자는 왼쪽부터 오른쪽까지 0부터 인덱싱되어 있습니다. 

charAt은 index로 주어진 값에 해당하는 문자를 리턴합니다. 

인덱스는 0부터 시작하기 때문에 index로 들어갈 수 있는 가장 큰 수는 (문자열.legnth-1)이다. 존재하지 않는 index를 인자로 전달하면 공백이 출력됩니다.

charAt 는 index에 해당하는 문자를 리턴하고, chartCodeAt은 유니코드 값을 리턴하는 차이가 있다.

 

예제 코드

JAVASCRIPT

charAt(index)

 

 

 

charCodeAt()

charCodeAt 메서드는 index에 해당하는 문자의 unicode 값을 리턴합니다.

 

문법(Syntax)

JAVASCRIPT

string.charCodeAt(index)

Copy

 

인자

  • ndex - 필수
  • 0보다 큰 정수

 

설명(description)

유니코드는 모든 시스템에서 일관되게 문자를 표현하기 위한 산업표준입니다. 

charCodeAt은 주어진 index에 해당하는 유니코드 값을 리턴하는데 이 값은 unicode가 지원되는 모든 시스템에서 동일한 문자를 가르킵니다. 

charAt는 index에 해당하는 문자를 리턴하고, chartCodeAt은 유니코드 값을 리턴하는 차이가 있습니다.

 

예제 코드

JAVASCRIPT

var stringName = '자바스크립트'; console.log(stringName.charCodeAt(0)); // 51088 // http://www.unicode.org/charts/PDF/UAC00.pdf 에서 '자'을 찾아보면 'C790'인데 이것은 16진수다. // 이를 10진수로 변환하면 51088 된다.

Copy

 

 

참고 관련 링크

  1. 유니코드
  2. 한글에 대한 유니코드

 

 

 



출처: https://webclub.tistory.com/329 [Web Club]

728x90

LiquidCrystal and Adafruit SSD1306(SSH1102) Collison Detected

- Library Collision, may be not distingsh between two I2C Sensors, LCD and OLED.

 

Trouble Shooting Processing Start..

+ Recent posts