전체 글

1 2 3 4 5 ··· 8

Blynk를 이용한 IoT스위치

2020. 12. 7. 03:51

Blynk를 이용한 IoT스위치


준비물 : Wemos D1 mini, 서보모터

 

 


ESP8266 중 하나인 Wemos D1 mini를 이용해서 IoT스위치를 제작해보겠습니다.

시중에서 판매중인 스위치봇처럼 외부에서 스위치를 작동시킬 수 있습니다.

Blynk 앱으로 ON/OFF 및 타이머 설정 등이 가능합니다.

 

 

 

보일러에 있는 기본 예약기능은 0~12시간 중 원하는 예약시간을 설정하면 30분간 난방한 후 정지되고

다시 난방을 반복하는 방식입니다.

지식인에 "보일러 시간"이라고만 검색해도 많은 사람들이 보일러의 예약기능에 대해서 어려워합니다.

보일러를 사용하는 사람들이라면 저처렴 원하는 시간에 켜고, 원하는 시간에 끌 수 있게 하고 싶을겁니다.

그래서 IoT스위치를 만들어서 보일러 제어 해보겠습니다.

 

 

 

 

서보모터의 갈색(GND), 빨간색(VCC), 주황색(데이터) 입니다.

 

 

 

5V - 빨간색

G - 갈색

D4 - 주황색

에 연결하면 하드웨어적인 부분은 끝.

 

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>

char auth[] = "인증키"; 		// blynk auth 코드 입력하기
char ssid[] = "wifi이름"; 	// wifi 이름 입력하기
char pass[] = "WiFi비밀번호";	// wifi 비밀번호 입력하기

Servo myservo;

BLYNK_WRITE(V1){
  myservo.write(param.asInt());
}
void setup() {
  Serial.begin(115200);
  Blynk.begin(auth,ssid,pass);
  myservo.attach(D4);
} 

void loop() {
  Blynk.run();
}

Wemos D1을 연결해서 아두이노 스케치로 업로드시켜줍니다.

인증키는 Blynk앱에서 받은 인증키를 입력하시면 됩니다.

Wifi이름 및 비밀번호는 사용하고 계시는 Wifi의 정보를 입력해주시면 됩니다.

(※올레공유기는 시도해봤으나 연결이 잘 안돼서 iptime으로 연결했습니다)

 

 

Blynk앱을 다운받습니다.

 

가입 후 New Project 선택
이름을 설정하고 생성
인증키가 메일로 발송되는데 인증키가 안올 경우 상단 설정(볼트모양)을 클릭하면 인증키를 복사하실 수 있습니다.
위젯은 3개(버튼 1, 타이머 2)로 구성했습니다. 타이머는 보기 쉽게하려고 2개로 만들었습니다.

 

 

(※위 사진에 보드 모양에 빨간 표시가 뜨면 기기랑 연결이 안되서 뜨는 표시입니다)

 

여기까지하시면 작동되는걸 확인할 수 있습니다. ✌️

 


설치하기

 

 

 

대략적인 설치위치를 잡고

 

케이스를 제작하여 설치했습니다.
기본 스크류의 길이가 짧아 연장시켰습니다.

정상작동되는걸 확인하실 수 있습니다 :D

 

 

 

+ 추가

 

스크류가 마음에 들지 않아 레진으로

 

 

 

적당한 길이의 스크류를 제작했습니다.

 

끝.



 

푸시락스위치로 LG정수기냉장고 물 연속으로 받기


준비물 : 푸시락스위치, 악어클립 2개, UTP 케이블 (또는 기타 케이블)


왼쪽이 집에서 구입한 냉장고 유형이고, 오른쪽이 제가 원했던 유형입니다.

왼쪽은 많은 양의 물을 담을 경우 계속 누르고 있어야 하지만,

오른쪽은 120ml, 500m, 1L, 연속과 같이 해당 용량을 터치 한번으로 받을 수 있는 기능이 기본 탑재 돼 있었습니다.

 

이 글은 계속 누르고 있어야 하는 불편함으로부터 시작했습니다......

 

 

 

어떤 방식으로 해야할지 고민을 하다가 아두이노에 서보모터를 연결해서 버튼을 누르면 눌러지게끔 만들어봤습니다.

 하지만 이 방식은 선도 지저분해지고 서보모터가 정수기버튼 옆에 튀어나와있어 불편함이 많았습니다.

 

 

그래서 생각하다가 누르는 버튼 밑에 틈을 확인해봤습니다. 🧐

 

정수기 버튼을 누르면 연결된 리미트스위치를 누르게 되어

 

파란색 커버가 씌워진 전선 두개의 접점이 서로 연결되어 물이 나오는 원리인 것을 확인했습니다.

복잡하게 아두이노를 쓸 필요없이 두 선에 전선을 연결시켜 구매한 스위치에 연결만 시켜주면 눌렀을 때 물이 나오게 됩니다.

 

누르는 버튼을 분리할 수가 없어서 좁은 틈을 후레시로 비추고 스마트폰 카메라로 확인해가며 작업했습니다.

좁은 틈으로 작업해야해서 납땜 등을 할 수 없어 악어클립을 연결해 핀셋으로 집었습니다.

집느라 고생 좀 했습니다.

( 주의! 혹여나 다른 곳을 잘못 건드리면 감전의 위험이 있을 수 있습니다.)

 

고무커버 위쪽에 드러난 부분이 있는데 이 부분에 악어클립으로 집었습니다.

악어클립에 UTP케이블을 연결하여 밖으로 빼냈습니다.

 

이제 빼낸 선을 푸시락스위치에 연결하고 고정시켜주면 끝입니다. (스위치, UTP, 악어클립은 미리 연결했습니다)

구석에 글루건으로 고정!

 

완성!

 

실제 동작영상입니다.

푸시락스위치를 누르면 스위치를 다시 눌러 끄기 전까지 계속해서 나오게 됩니다.

 

 

 

 

많은 양의 물을 받을 때 유용하게 사용하고 있습니다. 👍👍👍👍👍

 


'하드웨어 제작' 카테고리의 다른 글

Blynk를 이용한 IoT스위치  (0) 2020.12.07

앱 내에서 구글플레이로 이동방법


안드로이드 앱 내부에서 현재 앱이나 기타 앱의 구글플레이 정보로 이동하게 되는 경우가 있습니다.

주로 앱 설정창에서 앱에 대한 평가를 하기 위해 이동처리를 해줍니다.

 

 

 

앱 내에서 연결할 때는

market://details?id=<패키지명>

을 사용하시면 됩니다.

 

패키지명은 일일이 입력하실 필요없이 getPackageName()을 이용하시면 해당 프로젝트의 패키지를 가져오게 됩니다.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(intent);
uri = Uri.parse("market://details?id=" + getPackageName());
startActivity(new Intent(Intent.ACTION_VIEW, uri));

둘 중에 편하신거 사용하시면 됩니다.

 

 

 

+ 구글플레이 해당 앱으로 이동하는 링크입니다.

http://play.google.com/store/apps/details?id=<패키지명>

 



안드로이드 액티비티 세로고정


androidmanifest.xml에서 고정하고자하는 activity를 찾아서 태그 안에

android:screenOrientation="portrait"

을 추가해주시면 됩니다. (가로모드: landscape)

 

 

java 코드에서 적용을 하시려면

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

를 사용하시면 됩니다. setRequestedOrientation은 setContentView가 호출되기 이전에 작성을 해주셔야 합니다.

 

 

 

 

+ 기타 방향 설정

원하시는 설정을 적용하시면 됩니다. 아래값들은 안드로이드 가이드(바로가기) android:screenOrientation에서 확인하실 수 있습니다.

"unspecified" 기본값입니다. 시스템이 방향을 선택합니다. 시스템이 사용하는 정책과 특정 컨텍스트에서 이루어지는 선택은 기기마다 다를 수 있습니다.
"behind" 액티비티 스택에서 바로 아래에 있는 액티비티와 동일한 방향입니다.
"landscape" 가로 방향입니다(디스플레이의 높이보다 너비가 더 긺).
"portrait" 세로 방향입니다(디스플레이의 너비보다 높이가 더 긺).
"reverseLandscape" 정상적인 가로 방향에서 반대 방향인 가로 방향입니다. API 레벨 9에서 추가되었습니다.
"reversePortrait" 정상적인 세로 방향에서 반대 방향인 세로 방향입니다. API 레벨 9에서 추가되었습니다.
"sensorLandscape" 기기 센서에 따라 정상적인 가로 방향 또는 반전된 가로 방향이 될 수 있습니다. 사용자가 센서 기반 회전을 잠갔더라도 센서가 사용됩니다. API 레벨 9에서 추가되었습니다.
"sensorPortrait" 기기 센서에 따라 정상적인 세로 방향 또는 반전된 세로 방향이 될 수 있습니다. 사용자가 센서 기반 회전을 잠갔더라도 센서가 사용됩니다. API 레벨 9에서 추가되었습니다.
"userLandscape" 기기 센서 및 사용자의 기본 설정에 따라 정상적인 가로 방향 또는 반전된 가로 방향이 될 수 있습니다. API 레벨 18에서 추가되었습니다.
"userPortrait" 기기 센서 및 사용자의 기본 설정에 따라 정상적인 세로 방향 또는 반전된 세로 방향이 될 수 있습니다. API 레벨 18에서 추가되었습니다.
"sensor" 기기 방향 센서가 방향을 결정합니다. 디스플레이 방향은 사용자가 기기를 잡고 있는 방법에 따라 다르며 사용자가 기기를 회전할 때 변경됩니다. 그러나 일부 기기는 기본적으로 4개의 모든 방향으로 회전하지 않습니다. 4개의 모든 방향을 허용하려면 "fullSensor"를 사용합니다. 사용자가 센서 기반 회전을 잠근 상태라도 센서가 사용됩니다.
"fullSensor" 기기 방향 센서가 4개의 방향을 결정합니다. 이는 4개의 화면 방향을 허용한다는 것을 제외하면 기기가 정상적으로 수행하는 것과 상관없이 "sensor"와 유사합니다. (예를 들어, 일부 기기는 세로 반전 또는 가로 반전을 정상적으로 사용하지 않지만 이 특성은 정상적으로 사용합니다.) API 레벨 9에서 추가되었습니다.
"nosensor" 물리적 방향 센서를 참조하지 않고 방향을 결정합니다. 센서가 무시되므로 사용자가 기기를 이동하는 방법에 따라 디스플레이가 회전하지 않습니다.
"user" 사용자의 현재 기본 설정 방향입니다.
"fullUser" 사용자가 센서 기반 회전을 잠금 설정한 경우 user와 동일하게 작동하고, 잠금 설정을 하지 않은 경우 fullSensor와 동일하게 작동하며 4개의 화면 방향을 허용합니다. API 레벨 18에서 추가되었습니다.
"locked" 현재 회전 방향을 잠금 설정합니다. API 레벨 18에서 추가되었습니다.

[Android] Keystore 보안

2020. 11. 17. 21:54

Keystore 보안


 

앱을 배포하기 위해 apk 또는 aab에 앱서명을 하게되면 build.gradle에

Keystore의 Alias, password, File경로가 나타나게 됩니다.

signingConfigs {
	release {
        	storeFile file('keystore 경로')
        	storePassword '비밀번호'
    		keyAlias 'key()'
        	keyPassword '비밀번호'
	}
}

 

이와 같이 keystore의 정보가 노출된 상태로 Github나 기타 사이트에 업로드되면 악용될 수 있습니다.

그러므로 별도의 keystore file을 만들어 보안을 강화하는 것을 권장합니다.

 

- 프로젝트 탭을 선택하신 후 루트디렉토리에다가 keystore.properties파일을 만들어줍니다.

 

- keystore.properties 작성

파일 내부에 keystore 값들을 작성해줍니다.

 

storeFile = 경로
storePassword = 비밀번호
keyAlias = 별칭
keyPassword = 비밀번호

 

- build.gradle 작성

상단에 apply와 android 사이에 keystore.properties의 값들을 불러오는 작업을 해줍니다.

// Keystore Security
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

 

- signingConfigs 내부 수정

기존의 값들을 keystoreProperties['keyPassword']와 같이 바꿔주시면 됩니다.

signingConfigs {
	debug {
		storeFile file(keystoreProperties['storeFile'])
        	storePassword keystoreProperties['storePassword']
        	keyAlias keystoreProperties['keyAlias']
        	keyPassword keystoreProperties['keyPassword']
	}
}

 

 

 

이제 깃허브나 기타 사이트에 업로드하실 때 keystore.properties파일을 제외하고 업로드하시면 됩니다 :)



Android App Bundle 만들기


앱 제작을 완료한 후 apk파일이나 aab (Android App Bundle) 파일을 만드는 방법입니다.

 

- Build에서 Generate Signed Bundle / APK 클릭.

 

- 만들고자하는 확장자명 선택하시고 Next (aab 또는 apk 선택)

   aab는 apk보다 경량화된 앱을 제공합니다. 

 

- 처음 만드시는 분은 "Create new..."를 눌러줍니다.

- 빈칸을 입력해주시면 됩니다.    OK & Next

   ( ※ 주의: 키파일이랑 비밀번호를 분실하시면 추후에 앱 업데이트가 불가능합니다.)

- Finish를 눌러주시면 aab파일이 생성됩니다.

   apk파일도 같은 방법으로 생성하실 수 있습니다.

 



퍼미션 권한체크


테드퍼미션 https://github.com/ParkSangGwon/TedPermission

 

ParkSangGwon/TedPermission

Easy check permission library for Android Marshmallow - ParkSangGwon/TedPermission

github.com

박상권님 블로그 주소 : gun0912.tistory.com/

 

 

박상권이라는 분이 직접 만드신 라이브러리입니다. 권한체크방식을 라이브러리를 통해서 간단하게 줄일 수 있게 해주셨습니다.

감사합니다 (큰절)

 

사용방법을 알아보겠습니다.

우선 사용하기 위해서 gradle을 추가해줍니다.

implementation 'gun0912.ted:tedpermission:2.2.3'

 

PermissionListener로 접근 허용/거부 시 실행할 코드 작성가능하고,

TedPermission클래스를 이용해서 권한체크에 필요한 설정을 하실 수 있습니다.

PermissionListener permissionListener = new PermissionListener() {
	@Override
    public void onPermissionGranted() {
		// 접근허용 시 실행할 코드
	}

    @Override
	public void onPermissionDenied(List<String> deniedPermissions) {
		// 접근거부 시 실행할 코드
	}
};

TedPermission.with(this)
	.setPermissionListener(permissionListener)
    .setDeniedMessage("접근 거부하셨습니다.\n[설정] - [권한]에서 권한을 허용해주세요.")
    .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
    .check();

- setRationalMessage() : 권한체크 하기전 Dialog 메시지 설정

- setDeniedMessage() : 권한 거부했을 때 띄울 Dialog 메시지 설정

- setDeniedCloseButtonText() : 권한 거부 시 뜨는 Dialog의 [닫기]버튼 텍스트 설정

- setGotoSettingButtonText() : 권한 거부 시 [설정]버튼 텍스트 설정

- setGotoSettiongButton() : 권한 거부 시 [설정]버튼을 보여줄지 설정 (true / false)

 

※주의

TedPermission 클래스에서 setPermissions를 여러개 추가하시면 안됩니다.

저장공간에 대한 permission의 경우 .

setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)

와 같이 적어주셔야 됩니다.

저처럼 setPermissions 두번 작성했다가 못찾으면 고통받습니다.

.setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)

.setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)

 

 



저작권 무료 사이트 목록


1. 픽사베이 / https://pixabay.com

 

2. 언스플래시 / https://unsplash.com

 

Beautiful Free Images & Pictures | Unsplash

Beautiful, free images and photos that you can download and use for any project. Better than any royalty free or stock photos.

unsplash.com

 

3. 프리픽 / https://freepik.com

 

Freepik | Graphic Resources for everyone

Discover millions of copyright-free vectors, photos and PSD

www.freepik.com

 

4. 플리커 https://flickr.com

 

Flickr

Flickr는 세계 최고의 온라인 사진 관리 및 공유 응용 프로그램입니다. 전 세계 회원에게 좋아하는 사진과 동영상을 보여주거나 친구와 가족에게 콘텐츠를 개인적으로 안전하게 보여주거나 카메

www.flickr.com:443


'Others' 카테고리의 다른 글

안드로이드 앱 개인정보 취급방침  (0) 2020.04.16

다른 액티비티에 접근하기


1. Context 생성

가져오려고하는 Activity에서 context를 선언해주고, onCreate 내부에 this로 할당시켜줍니다.

public class MainActivity extends AppCompatActivity {
 
     public static Context context;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
 
          context = this;
     }
}

 

2. 접근

사용하려는 Activity에서 아래와 같이 접근하시면 됩니다.

메서드 또는 변수에 접근하실 수 있습니다.

((MainActivity) MainActivity.context);

 

((MainActivity) MainActivity.context).aaa();
((MainActivity) MainActivity.context).num;


지문인식 설정


 

sseong66.tistory.com/60

 

[Android] 지문인식 구현하기

지문인식 구현하기 1. AndroidManifest.xml 권한추가 2. gradle dependency추가 3. java코드 추가 1. AndroidManifest.xml 권한추가 2. gradle dependency추가 implementation 'androidx.biometric:biometric:1.0..

sseong66.tistory.com

위 게시글을 보면 지문인식을 MainActivity에서 구현을 했는데

환경설정에서 ON, OFF 했을 때 Main에서 동작을 켜고끄려면 SharedPreferences를 사용해서 SwitchPreference에 설정한 값을 불러와주시면 됩니다.

 

Preference 뷰는 간단하게 만들어봤습니다. SwitchPreference를 가져올 key값을 fingerprint로 설정했습니다.

MainActivity에서 SwitchPreference로 접근해보겠습니다.

<PreferenceCategory
	android:title="보안 설정">

	<SwitchPreference
		android:key="fingerprint"
		app:iconSpaceReserved="false"
		android:defaultValue="false"
		android:summaryOn="켜짐"
		android:summaryOff="꺼짐"
		android:title="지문인식"/>
</PreferenceCategory>

 

MainActivity에서 Preference에서 설정한 값이 저장된 SharedPreferences에 접근합니다.

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

 

fingerprint에 해당하는 boolean값을 preferences.getBoolean으로 가져와서 원하는 설정을 해주시면 됩니다.

아래와 같이 해주시면 스위치ON일 때 지문인식이 실행되고, OFF일때 취소되게 됩니다.

if (preferences.getBoolean("fingerprint", false)){
	biometricPrompt.authenticate(promptInfo);
}else {
	biometricPrompt.cancelAuthentication();
}

 


+ Recent posts