模拟操作智能农业项目

原创 2018年04月15日 15:26:11

一、模拟智能农业项目简介

通过手机APP操作模拟智能农业系统。通过手机来获取农业沙盘数据,例如:温度、湿度等。实现对沙盘设备的控制,例如:开、关灯,开、关水泵等等。

二、功能需求及可行性分析:

功能需求:
可以获取沙盘数据;
可以控制沙盘设备;
获取设备开关状态;

可行性分析:
通过API文档获取JSON数据接口:
例如获取传感器的值:http://192.168.1.119:8890/type/jason/action/getSensor
注意:接口文档中的IP需改为开发时实际对应的IP
10.44.1.104
这样就能够获取到传感器的数据了。

三、代码实现:

首先将各个页面布局做好:
欢迎界面:
效果:
这里写图片描述

打开程序、跳出对话框,获取对应沙盘IP

代码如下:


    public class WelcomeActivity extends AppCompatActivity {
        public static   String url;
        public  EditText  input_edt;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_welcome);

            AlertDialog.Builder builder = new AlertDialog.Builder(WelcomeActivity.this);
            View view = View.inflate(WelcomeActivity.this, R.layout.alertdialog, null);
            builder.setView(view);
            builder.setCancelable(true);
            TextView title = (TextView) view.findViewById(R.id.title);//设置标题
            input_edt = (EditText) view.findViewById(R.id.dialog_edit);//输入内容
            Button btn_comfirm = (Button) view.findViewById(R.id.btn_comfirm);//确定按钮

            //取消或确定按钮监听事件处理
            AlertDialog dialog = builder.create();
            btn_comfirm.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //传输IP
                    url=input_edt.getText().toString();
                    Intent intent = new Intent(WelcomeActivity.this, MainActiviy.class);
                    startActivity(intent);

                }
            });
            dialog.show();
        }
    }

主页面:
效果图:

这里写图片描述

头部图片使用ViewPager与Fragment结合实现图片滑动效果

创建MainFargmentAdapter继承自FragmentPagerAdapter:

public class MainFargmentAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;

    public MainFargmentAdapter(FragmentManager fm,List<Fragment> fragments) {
        super(fm);
        this.fragmentList=fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

创建三个PicFragment,放入图片,代码简单,所以省略。

然后在MainActivity里修改代码如下:

   private ViewPager viewPager;
    private Pic1Fragment pic1Fragment;
    private Pic2Fragment pic2Fragment;
    private Pic3Fragment pic3Fragment;
    private List<Fragment> fragmentList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mian2);
        bindId();
        pic1Fragment = new Pic1Fragment();
        pic2Fragment = new Pic2Fragment();
        pic3Fragment = new Pic3Fragment();

        fragmentList.add(pic1Fragment);
        fragmentList.add(pic2Fragment);
        fragmentList.add(pic3Fragment);

//创建适配器、绑定适配器
        MainFargmentAdapter adapter = new MainFargmentAdapter(getSupportFragmentManager(), fragmentList);
        viewPager.setAdapter(adapter);
    }

获取传感器的值:

首先,创建一个公共的OKHttPClint类,连接数据接口,创建两个方法,get和Post方法:

    //获取WelcomeActivity中传过来的IP
    public static final String BASE_URL = "http://"+WelcomeActivity.url+":8890/type/jason/action/";

    public static OkHttpClient client = new OkHttpClient();
    public static void getOkHttp(String address, okhttp3.Callback callback) {

        Request request = new Request.Builder().url(getAbsoluteUrl(address)).build();
        client.newCall(request).enqueue(callback);
    }

    public static void postOkHttp(String url, JSONObject jsonObject, Callback callback){
        MediaType mediaType=MediaType.parse("application/json;charset=UTF-8");
        RequestBody requestBody=RequestBody.create(mediaType,jsonObject.toString());
        Request request=new Request.Builder().url(getAbsoluteUrl(url)).post(requestBody).build();
        client.newCall(request).enqueue(callback);
    }

    private static String getAbsoluteUrl(String relation) {
        return BASE_URL + relation;
    }

}

修改MainActivity的代码,获取传感器的值使用的是get方法:

获取数据是耗时操作,要使用runOnUiThread方法更新UI。

        HttpUtilOk.getOkHttp("getSensor", new Callback() {

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                cancleProgress();
                String url = response.body().string();
                try {
                    JSONObject object = new JSONObject(url);
                    co2 = object.getString("co2");
                    light = object.getString("light");
                    soilwen = object.getString("soilTemperature");
                    soilshi = object.getString("soilHumidity");
                    airwen = object.getString("airTemperature");
                    airshi = object.getString("airHumidity");
                    //将解析下来的数据放入控件中
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            co2Tv.setText("co2:" + co2 );
                            lightTv.setText("光照: " + light);
                            soilwenTv.setText("温度: " + soilwen);
                            soilshiTv.setText(" 湿度:" + soilshi);
                            airwenTv.setText("温度:" + airwen);
                            airshiTv.setText(" 湿度:" + airshi);
                        }
                    });
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                cancleProgress();
            }

        });

以上代码就能够在主页上获取沙盘的数据;

控制沙盘设备

以CO2界面为例,控制风扇和警报设备:

效果图:
这里写图片描述

由于其余三个界面都需要实现相同的设备控制,

所以在这里我将控制风扇、警报、灯光、水泵四个方法单独封装起来:

例如开、关风扇的方法,其余几个方法同下:

public class Blower {
    private  int number=0;
    private Context mcontext;
    HttpUtil util=new HttpUtil();
    final String url = util.BASE_URL;

    public void kaiFengShan() {
        JSONObject object=new JSONObject();
        try {
            object.put("Blower",1);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        HttpUtilOk.postOkHttp("control", object, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    }
    public void guanFengShan() {
        JSONObject object=new JSONObject();
        try {
            object.put("Blower",0);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        HttpUtilOk.postOkHttp("control", object, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });

    }
}

获取沙盘设备当前状态

创建一个Status类,封装一个获取状态的方法controlAll,定义四个公共的静态变量,用来传当前设备状态:

public class Status {
    public static int waterPumpStatus ;
    public static int roadLampStatus;
    public static int buzzerStatus;
    public static int blowerStatus;


    public static   void controlAll(){

        HttpUtilOk.getOkHttp("getContorllerStatus", new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result=response.body().string();
                JSONObject object = null;
                try {
                    object = new JSONObject(result);
                    waterPumpStatus = object.getInt("WaterPump");
                    roadLampStatus = object.getInt("Roadlamp");
                    buzzerStatus = object.getInt("Buzzer");
                    blowerStatus = object.getInt("Blower");
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });

    }
}

公共的方法已经封装好了,接下来就可以根据页面需求使用:

获取Buzzer 、Blower 对象,

定义标志位:buzzerInt和blowerInt获取Status传过来的设备状态

更新图标

public class Co2Activity extends AppCompatActivity implements View.OnClickListener {

    private ImageView fengShanIm;
    private ImageView jingbaoIm;
    Buzzer buzzer=new Buzzer();
    Blower blower=new Blower();
    private int buzzerInt;
    private int blowerInt;
    private TextView nongduTV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_co2);
        bindId();
        //进入页面就获取当前设备状态
        Status.controlAll();
        //获取设备状态
        buzzerInt = Status.buzzerStatus;
        blowerInt = Status.blowerStatus;
        //进入页面就更新图标
        queryBlower();
        queryBuzzerImage();

    }

    private void bindId() {
        fengShanIm = findViewById(R.id.Co2_dakaifengshan);
        jingbaoIm = findViewById(R.id.Co2_dakaijingbao);
        nongduTV=findViewById(R.id.Co2_nongdu);

        fengShanIm.setOnClickListener(this);
        jingbaoIm.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.Co2_dakaifengshan:
                blowerInt++;
                queryBlower();
             if (blowerInt%2==1){
                 blower.kaiFengShan();
             }else if (blowerInt%2==0){
                 blower.guanFengShan();
             }
                break;
            case R.id.Co2_dakaijingbao:
                buzzerInt++;
                queryBuzzerImage();
                if (buzzerInt%2==1){
                    buzzer.kaiJingbao();
                }else if (buzzerInt%2==0){
                    buzzer.guanJingbao();
                }
                break;
        }
    }
    //根据状态更新图标
    public void queryBlower(){
        if (blowerInt % 2 == 0) {
            fengShanIm.setImageResource(R.drawable.dakaifengshan);
        } else if (blowerInt % 2 == 1) {
            fengShanIm.setImageResource(R.drawable.dakaifengshan2);
        }
    }
    private void queryBuzzerImage() {
        if (buzzerInt % 2 == 0) {
            jingbaoIm.setImageResource(R.drawable.dakaibaojing);
        } else if (buzzerInt % 2 == 1) {
            jingbaoIm.setImageResource(R.drawable.dakaibaojing2);
        }
    }
}

以上就可以实现三个最核心的功能,其余页面可以根据以上代码继续完善。

基于ZigBee的智慧农业监测系统

我国是农业大国, 传统农业在国际市场上的优势主要依赖于丰富的自然资源和低廉的劳动力成本。随着物联网等高新技术的发展,我国传统农业正在加快向现代农业转型,而智慧农业将成为现代农业未来发展的趋势。所谓“智...
  • liqingkk
  • liqingkk
  • 2015年05月27日 22:20
  • 2532

智能农业app(打开风扇)

初学者运用Http请求传参控制沙盘(风扇、警报、、)
  • jump_down
  • jump_down
  • 2017年03月20日 22:16
  • 178

盘点10种最酷农业机器人

盘点10种最酷农业机器人 2015-05-14 09:07:44 来自农产品品牌营销 阅读(3809) 分享 剑桥大学奶牛场,挤奶工作全部由机器人独...
  • alaclp
  • alaclp
  • 2015年07月02日 01:20
  • 1158

智能机井灌溉项目

使用RTU设备,采集智能测控装置、电力仪器、流量计数据,通过Zigbee传输数据到DTU,再将汇聚数据分别上传到县局平台和省局平台,其基本模型如下图所示。 简单介绍下基本流程,首先是RTU硬件...
  • ljx333
  • ljx333
  • 2017年06月06日 17:11
  • 204

联想智能农业移动应用开发系统用户手册

1. 系统介绍 1.1 系统概述 联想智能农业移动应用开发系统是一套模拟智能农业场景的应用研发测试平台。可广泛运用于移动APP开发、嵌入式设备开发、软件测试、用户体验测试(需配选件)等。不...
  • qq_15950325
  • qq_15950325
  • 2016年10月24日 22:26
  • 3419

智能农业

private void drawFrame(Canvas canvas){        calculateLeft();                 //绘制横线        for(int...
  • qq_27305737
  • qq_27305737
  • 2015年10月02日 10:48
  • 1239

ZigBee在智慧农业中的应用

电子技术、传感器技术及网络技术的发展促进了农业信息化水平的提高,以信息网络为中心的智慧农业、精准农业等一系列新的农业生产模式已成为当前研究的热点。通过大量遍布于农田、温室大棚等目标区域的传感器,实时采...
  • liqingkk
  • liqingkk
  • 2015年05月19日 23:10
  • 1735

RaspberryPi和Arduino温室恒温改进

前一篇文章使用RaspberryPi和Arduino控制温室的温度,发现树莓派读取温度是总会出错,原因在于DHT11的控制协议是微秒级别的,但是树莓派达不到,因此改成传感器都有Arduino控制,树莓...
  • winlinvip
  • winlinvip
  • 2016年01月24日 00:34
  • 1313

智能灌溉系统应用方案

智能灌溉系统应用方案  随着水资源问题的加剧,发展节水型农业变得十分必要。目前,除了采用喷灌、微灌等节水灌溉技术,采用先进的自动化控制技术按作物实际需水为依据,实施精确灌溉,提高水的利用率的智能灌溉...
  • xmjxabc
  • xmjxabc
  • 2018年01月12日 15:11
  • 90

如果你正在寻找项目,并且对农业感兴趣,欢迎进来来

我想很多想创业的朋友都有这样几个困惑:1、不知道选择哪个行业。现在各行各业的竞争都已到了白热化的程度,尤其在目前全国经济陷入低迷的情况下,许多知名大型企业都已纷纷宣布准备“冬眠”,谁都不好说哪个行业有...
  • yehaishan123
  • yehaishan123
  • 2008年09月16日 16:14
  • 616
收藏助手
不良信息举报
您举报文章:模拟操作智能农业项目
举报原因:
原因补充:

(最多只允许输入30个字)