1、通过上一篇文章可知道,通过ESP8266控制红外线模块可以遥控家里的电器。原理是通过访问一个ESP8266中的网页,达到发送响应红外信号的目的。但是每次总不能用手机浏览器去打开网页吧。所以做了一个app,功能原理非常简单,就是相应的按钮触发响应的网页,达到控制的目的。用到了webview控件来打开网页,并且不让他跳转手机自带浏览器,这样就方便多了。
2.
这是控制界面,界面简陋,只设计了海尔空调一个界面。基本功能可以实现。
①开机默认25度制冷,通过模式按钮可以调节制热和制冷。
②制冷是20度-28度。制热是20度-30度。
③初始状态显示关闭,点击开机按钮之后显示温度和状态。如下:
④点击开始按钮,显示温度和状态:
⑤基本功能就是这样了。
3.一些思路:由于本人纯小白,所以很多编程方法不见得正确。还请批评指正:
①实现按键的按压效果:使用图片按钮控件,背景设置为自己网上找的图片,例如这个开机按钮。
要实现其触摸跳动的效果,我弄了2个图片,一个没有白色边框,一个白色边框大一些。然后程序设置为,检测到按压就替换为有边框的那个图片,看上去就好像是按钮缩小了。因此实现了按钮触控效果,否则按上去按钮没有任何变化,视觉效果不好,也不知道是否按上去了。
②此处雪花标志和太阳标志代表制冷和制热,初始状态设置为不可见,然后通过模式调节,按逻辑设置其可见状态,即可实现雪花和太阳的效果。
③发送的红外代码,我使用的是TB买的红外接收模块,插在ESP8266上可以通过串口显示出相应的遥控代码,实现对空调的控制。
package com.example.opentv;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageButton;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity2 extends AppCompatActivity {
Button TestButton7, TestButton9; //创建button
int Openflag = 0; //0:关机;1:开机
int Coldstate = 0;//0:制冷;1:制热;
int temperature = 25;
ImageButton imageButton1,imageButton2,imageButton3,imageButton4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
getWindow().setBackgroundDrawableResource(R.drawable.bizhi);
ImageView iv1 = findViewById(R.id.imageView);//雪花标志
ImageView iv2 = findViewById(R.id.imageView2);//太阳标志
TextView tv1 = findViewById(R.id.textView5); //温度显示数字
TextView tv2 = findViewById(R.id.textView6); //°C显示
TextView tv3 = findViewById(R.id.textView8); //关闭 显示
iv1.setVisibility(View.INVISIBLE); //初始状态雪花不可见,空调还没开呢。
iv2.setVisibility(View.INVISIBLE); //初始状态太阳不可见,空调还没开呢。
tv1.setVisibility(View.INVISIBLE);
tv2.setVisibility(View.INVISIBLE);
imageButton1 = findViewById(R.id.imageButton);
imageButton2 = findViewById(R.id.imageButton2);
imageButton3 = findViewById(R.id.imageButton3);
imageButton4 = findViewById(R.id.imageButton4);
imageButton1.setOnClickListener(new MainActivity2.mButtonListener());
imageButton2.setOnClickListener(new MainActivity2.mButtonListener());
imageButton3.setOnClickListener(new MainActivity2.mButtonListener());
imageButton4.setOnClickListener(new MainActivity2.mButtonListener());
iv2.setOnClickListener(new MainActivity2.mButtonListener());
imageButton1.setOnTouchListener(new View.OnTouchListener() { //开机键触发设置
@Override
public boolean onTouch(View v, MotionEvent event) {
if(Openflag == 0) {
iv1.setVisibility(View.VISIBLE);
tv1.setVisibility(View.VISIBLE);
tv2.setVisibility(View.VISIBLE);
tv3.setVisibility(View.INVISIBLE);
}
else if(Openflag == 1)
{
iv1.setVisibility(View.INVISIBLE);
iv2.setVisibility(View.INVISIBLE);
tv1.setVisibility(View.INVISIBLE);
tv2.setVisibility(View.INVISIBLE);
tv3.setVisibility(View.VISIBLE);
}
tv1.setText("25");//默认制冷制热都是25度
if (event.getAction() == MotionEvent.ACTION_DOWN) {
imageButton1.setBackgroundResource(R.drawable.turnof1);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
imageButton1.setBackgroundResource(R.drawable.turnof);
}
return false;
}
});
imageButton2.setOnTouchListener(new View.OnTouchListener() { //模式切换功能设置
@Override
public boolean onTouch(View v, MotionEvent event) {
if((Coldstate == 0)&&(Openflag == 1)) { //转为制热模式
iv1.setVisibility(View.INVISIBLE);
iv2.setVisibility(View.VISIBLE);
}
else if((Coldstate == 1)&&(Openflag == 1)) //制冷模式
{
iv1.setVisibility(View.VISIBLE);
iv2.setVisibility(View.INVISIBLE);
}
tv1.setText("25");//默认制冷制热都是25度
if (event.getAction() == MotionEvent.ACTION_DOWN) {
imageButton2.setBackgroundResource(R.drawable.coldhot1);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
imageButton2.setBackgroundResource(R.drawable.coldhot);
}
return false;
}
});
imageButton3.setOnTouchListener(new View.OnTouchListener() { //温度加号功能设置
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
imageButton3.setBackgroundResource(R.drawable.jia1);
if((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "25")) //如果是制冷模式且空调开机
{
temperature = 26;
tv1.setText("26");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "26")))
{
temperature = 27;
tv1.setText("27");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "27")))
{
temperature = 28;
tv1.setText("28");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "20")))
{
temperature = 21;
tv1.setText("21");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "21")))
{
temperature = 22;
tv1.setText("22");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "22")))
{
temperature = 23;
tv1.setText("23");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "23")))
{
temperature = 24;
tv1.setText("24");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "24")))
{
temperature = 25;
tv1.setText("25");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "20")))
{
temperature = 21;
tv1.setText("21");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "21")))
{
temperature = 22;
tv1.setText("22");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "22")))
{
temperature = 23;
tv1.setText("23");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "23")))
{
temperature = 24;
tv1.setText("24");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "24")))
{
temperature = 25;
tv1.setText("25");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "25")))
{
temperature = 26;
tv1.setText("26");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "26")))
{
temperature = 27;
tv1.setText("27");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "27")))
{
temperature = 28;
tv1.setText("28");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "28")))
{
temperature = 29;
tv1.setText("29");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "29")))
{
temperature = 30;
tv1.setText("30");
}
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
imageButton3.setBackgroundResource(R.drawable.jia);
}
return false;
}
});
imageButton4.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "25")) //如果是制冷模式且空调开机
{
temperature = 24;
tv1.setText("24");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "24")))
{
temperature = 23;
tv1.setText("23");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "23")))
{
temperature = 22;
tv1.setText("22");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "22")))
{
temperature = 21;
tv1.setText("21");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "21")))
{
temperature = 20;
tv1.setText("20");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "28")))
{
temperature = 27;
tv1.setText("27");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "27")))
{
temperature = 26;
tv1.setText("26");
}
else if(((Coldstate == 0)&&(Openflag == 1)&&(tv1.getText() == "26")))
{
temperature = 25;
tv1.setText("25");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "25")))
{
temperature = 24;
tv1.setText("24");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "24")))
{
temperature = 23;
tv1.setText("23");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "23")))
{
temperature = 22;
tv1.setText("22");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "22")))
{
temperature = 221;
tv1.setText("21");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "21")))
{
temperature = 20;
tv1.setText("20");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "30")))
{
temperature = 29;
tv1.setText("29");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "29")))
{
temperature = 28;
tv1.setText("28");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "28")))
{
temperature = 27;
tv1.setText("27");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "27")))
{
temperature = 26;
tv1.setText("26");
}
else if(((Coldstate == 1)&&(Openflag == 1)&&(tv1.getText() == "26")))
{
temperature = 25;
tv1.setText("25");
}
imageButton4.setBackgroundResource(R.drawable.jian1);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
imageButton4.setBackgroundResource(R.drawable.jian);
}
return false;
}
});
}
public class mButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
int id = v.getId();
if ((id == R.id.imageButton)&&(Openflag == 0)) //海尔-开
{
Openflag = 1;
Coldstate = 0; //开机总是制冷模式
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio/8"); //导入页面
}
else if ((id == R.id.imageButton)&&(Openflag == 1)) //海尔-关
{
Openflag = 0;
Coldstate = 0;
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio/9"); //导入页面
}
else if ((id == R.id.imageButton2)&&(Openflag == 1)&&(Coldstate == 1)) //如果按下模式切换,且空调开着,且为制冷
{
Coldstate = 0;//制冷模式
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio/0"); //导入页面
}
else if ((id == R.id.imageButton2)&&(Openflag == 1)&&(Coldstate == 0)) //如果按下模式切换,且空调开着,且为制热
{
Coldstate = 1;//制热模式
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio1/0"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 20)) //如果是制冷模式且空调开机
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio1/9"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 21))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/0"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 22))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/1"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 23))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/2"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 24))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/3"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 25))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio/8"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 26))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/4"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 27))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/5"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 0)&&(Openflag == 1)&&(temperature == 28))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio2/6"); //导入页面
}
//以下是制热模式温度调节信号
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 20)) //如果是制冷模式且空调开机
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/0"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 21))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/1"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 22))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/2"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 23))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/3"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 24))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/4"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 25))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio1/0"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 26))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/5"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 27))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/6"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 28))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/7"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 29))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/8"); //导入页面
}
else if(((id == R.id.imageButton3)||((id == R.id.imageButton4)))&&(Coldstate == 1)&&(Openflag == 1)&&(temperature == 30))
{
WebView wb = (WebView) findViewById(R.id.webview3); //找到WebView控件
wb.setWebViewClient(new WebViewClient()); //防止用浏览器打开网页
wb.loadUrl("http://192.168.3.101/gpio3/9"); //导入页面
}
}
}
}
4。由于不知道遥控器的具体编码规则,因此没有设计更多的模式切换,例如除湿和通风等,用的是最笨的if-else穷举所有温度代码。
5、感谢CSDN平台和其他大神们,我参考了他们的代码,然后在他们的代码框架下修改的自己的内容,没有他们的代码,这个app我根本做不出来,也不会做。