基于GEC6818开发板实现自动贩卖机(C语言 + lvgl库 + 系统编程 + 网络编程 + sqlite3数据库)

演示

一、功能:

    面向用户:
        1、商品浏览 (LVGL)
        2、商品选择
        3、商品购买(预留)+存量更新
        4、搜索商品(拓展)
    面向商家:
        1、广告显示
        2、订单生成(服务器+数据库)
        3、管理员后台对售卖货物的管理

二、框架

     1、lvgl库:

             ①:参考:

               欢迎阅读百问网LVGL中文开发手册! — 百问网LVGL中文教程文档 文档

             

             ②:屏幕无操作时返回广告页面,在主函数while循环里面检测屏幕空闲度,达到100且到                       达一定时间就返回

    unsigned int time_count = 0;//计算屏幕空闲时间

    /*4、循环不断的监测用户有没有操作屏幕*/
    while(1) 
    {
    
        lv_timer_handler();
        usleep(5000);


        /*屏幕无操作返回广告页面*/
        //printf("lv_timer_get_idle() = %d\n", lv_timer_get_idle());
        //屏幕空闲等于100时,开始计数
        if(lv_timer_get_idle() >= 100)
        {
            time_count++;
            //printf("time_count = %d\n", time_count);
        }

        //不等于100时计数清零
        else
        {
            time_count = 0;
        }
        if(time_count >= 2000)//计数达到2000,大约14秒
        {
            AdvertisingPage();//跳转广告页面
        }
    }

     2、C基础部分

          略

    3、系统+网络编程

                1、商品信息由本地文件提供变为服务器(虚拟机)数据库提供

                2、数据库使用sqlite3,轻量高效,容易操作

                3、TCP协议,虚拟机作为服务器,6818开发板为客户端,可以多台客户端连接服务器                       (两者之间的通信)

三、部分代码

        

/*贩卖机主界面*/
void Main_Menu(lv_event_t * e) 
{

    usleep(50000);
    lv_obj_clean(lv_scr_act()); // 清理屏幕

    //选择商品界面
    C_choose = lv_obj_create(lv_scr_act()); 
    lv_obj_set_size(C_choose, 160, 260);
    lv_obj_set_pos(C_choose, 640, 50);

    //初始提示语
    lv_obj_t * label_wel = lv_label_create(C_choose); 
    lv_obj_align(label_wel, LV_ALIGN_CENTER, 0, 20);
    lv_label_set_text(label_wel, "  Welcome!");
    lv_obj_set_width(label_wel, 100);
    lv_obj_set_height(label_wel, 80);

    // 确定按钮
    lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
    lv_obj_set_size(btn1, 85, 65);
    lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
    lv_obj_t * label_en = lv_label_create(btn1);
    lv_label_set_text(label_en, "Enter");
    lv_obj_center(label_en);

    //管理员功能
    lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
    lv_obj_set_size(btn2, 70, 480);
    lv_obj_set_pos(btn2, 0, 0);
    lv_obj_t * label_en2 = lv_label_create(btn2);
    lv_label_set_text(label_en2, "Root");
    lv_obj_center(label_en2);
    lv_obj_add_event_cb(btn2, Root_login, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面




    /*选项卡列表*/
    lv_obj_t * tabview;
    tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);
    lv_obj_set_size(tabview, 570, 480); // 设置选项卡列表的大小
    lv_obj_set_pos(tabview, 70, 0);
    lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), 0); // 颜色


    lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
    lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_BLUE, 3), 0);
    lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_BLUE, 6), 0);
    lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);

    /*选项卡Tab1*/
    lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
    lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局

    // Get_CInfo();
    CL * p = Head->next;
    // 循环根据链表的节点个数来创建对象
    while(1) {

        lv_obj_t * temp = lv_obj_create(tab1);
       
        lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小

        lv_obj_t * label_name   = lv_label_create(temp); // 创建标签对象--商品名
        lv_obj_t * label_price  = lv_label_create(temp); // 创建标签对象--商品价格
        lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
        lv_obj_t * img_picture  = lv_img_create(temp);   // 创建标签对象--商品照片

        if(p->CInfo.CMargin > 0) // 商品余量大于0,可以购买
        {
            lv_obj_t * C_add = lv_obj_create(temp); // 购买
            lv_obj_align(C_add, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
            lv_obj_set_size(C_add, 35, 35);
            lv_obj_add_event_cb(C_add, CI_Choose, LV_EVENT_SHORT_CLICKED, p); // 调用选择商品函数
            lv_obj_t * img_picture1 = lv_img_create(temp);                  // 图片
            lv_obj_align(img_picture1, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
            lv_img_set_src(img_picture1, "S:/root/user/mydemo/goumai.bmp");
        }
        if(p->CInfo.CMargin == 0) // 少于0则不能购买,显示为NULL
        {
            lv_obj_t * label_null = lv_label_create(temp);
            lv_label_set_text(label_null, "NULL!");
            lv_obj_align(label_null, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
        }

        // 显示标签--商品信息
        lv_label_set_text(label_name, p->CInfo.CName); // 商品名
        lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);

        char buf[128] = {"\0"};
        sprintf(buf, "$%.1f", p->CInfo.CPrice); // 商品价格
        lv_label_set_text(label_price, buf);
        lv_obj_align(label_price, LV_ALIGN_BOTTOM_LEFT, 20, 0);

        sprintf(buf, "%d", p->CInfo.CMargin); // 商品余量
        lv_label_set_text(label_Margin, buf);
        lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 50);

        lv_img_set_src(img_picture, p->CInfo.CPicture); // 商品图片
        lv_obj_set_size(img_picture, 100, 128);         // 设置图片大小
        lv_obj_set_pos(img_picture, 0, 0);

        // 切换到下一个节点
        p = p->next;
        if(p == Head) break; // 绘制完成即结束商品打印
    }
    lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);

    sum     = 1;  // 更新默认购买数量
    Search_box(); // 搜素框+键盘
}


/*广告页面*/
void AdvertisingPage(void)
{
    
    lv_obj_clean(lv_scr_act()); // 清理屏幕
    lv_obj_t * img_advertisement = lv_img_create(lv_scr_act());
    lv_obj_set_size(img_advertisement, 800, 480); // 设置大小
    lv_obj_set_pos(img_advertisement, 0, 0);      // 位置
    lv_img_set_src(img_advertisement, "S:/root/user/mydemo/gg.bmp");
    lv_obj_add_flag(img_advertisement, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击

    // 滚动文字
    lv_obj_t * label1 = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); // 滚动文字
    lv_obj_set_width(label1, 400);
    lv_obj_set_height(label1, 80);

    lv_label_set_text(label1, "Tap the screen to start buying!  "
                              "Tap the screen to start buying!"
                              "Tap the screen to start buying!"); // 文本

    lv_obj_set_style_text_color(label1, lv_color_hex(0xED1C1C), LV_PART_SCROLLBAR); // 字体颜色
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_36, LV_STATE_DEFAULT);
    lv_obj_align(label1, LV_ALIGN_BOTTOM_MID, 0, 0); // 位置;参考对象,对齐方式,x轴偏移量,y轴偏移量
    lv_obj_add_event_cb(img_advertisement, Request, LV_EVENT_LONG_PRESSED, NULL);
    lv_obj_add_event_cb(img_advertisement, Main_Menu, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
    
}
//获取商品信息
void Get_CInfo(void)
{
    char *p = Rbuf;
    char *p1;
    Head = List_Create();//创建链表
    CI temp ;//创建结构体
    while(1)
    {
        p1 = strchr(p,'#');
        if(p1 == NULL)
        {
            break;
        }
        *p1 = '\0';
        strcpy(temp.CName,p);//商品名字
        p = p1 + 1;

        p1 = strchr(p,'#');
        *p1 = '\0';
        temp.CID = atoi(p);//商品编号
        p = p1+1;

        p1 = strchr(p,'#');
        *p1 = '\0';
        temp.CPrice = atof(p);//商品价格
        p = p1+1;

        p1 = strchr(p,'#');
        *p1 = '\0';
        strcpy(temp.CPicture,p);//商品图片地址
        p = p1+1;

        p1 = strchr(p,'\n');
        *p1 = '\0';
        temp.CMargin = atoi(p);//商品余量
        p = p1+1;
        if(p == NULL)
        {
            break;
        }

        List_TailInsert(Head,temp );

    }
    printf("链表:\n");
    List_Ergodic(Head,1);
    memset(Rbuf,0,sizeof(Rbuf));//清空
    
}


//读取服务器发送的数据
void *Client_read(void *arg)
{   
    // int  socket_fd = (int)arg;
    while(1)
    {

        // pthread_mutex_lock(&mutex);
        ssize_t n = read(socket_fd,Rbuf,sizeof(Rbuf));
        printf("收到服务器:%s\n",Rbuf);
        // pthread_mutex_unlock(&mutex);
        if(n == 0)
        {
            printf("服务器关闭\n");
            exit(0);
        }
        if(n>0)
        {
            Get_CInfo();
        }
    }
    
    // memset(Rbuf,0,sizeof(Rbuf));
    // return NULL;    
}

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值