李优秀 发表于 2024-9-7 22:58:49

基于GEC6818开辟板实现自动贩卖机(C语言 + lvgl库 + 体系编程 + 网络编程

演示

一、功能:

    面向用户:
        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 = {"\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)
{   
    // intsocket_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;   
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于GEC6818开辟板实现自动贩卖机(C语言 + lvgl库 + 体系编程 + 网络编程