GSM модуль + Arduino + LCD = уровень сигнала в виде полосы, процента

Antivir
Antivir аватар
Offline
Зарегистрирован: 16.09.2011

Всем привет! Нужна помощь.

Руки есть, все необходимое вроде тоже есть. (LCD ACM1602BE-FL-YTH-QM13; Arduino nano (есть на разбор PIC контроллеры и некоторые ATmel); GSM модуль, чуть позже напишу какие SIM900, ... )

Задача: Соеденить GSM модуль c Arduino и LCD + добавить кнопку перезагрузки и переключения SIM карт. И получать уровень сигнала в виде полосы, процента и баллы до 32.

ACM1602BE-FL-YTH-QM13

Зарание спасибо за помошь

brdm
Offline
Зарегистрирован: 04.06.2015

"полоска" барграф заточена по LCD-шилд, далее руками доделываем рюшики и бантики...

/* Inclut la librairie pour le lcd */
#include <LiquidCrystal.h>
 
/* Créer l'bjet lcd sur les broches utilisé par la shield lcd DFrobots */
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
/* Listes des touches de la shield lcd DFrobots */
enum {
  BP_NONE,
  BP_SELECT,
  BP_LEFT,
  BP_UP,
  BP_DOWN,
  BP_RIGTH
};
 
/* Caractères personnalisés */
byte r0[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
}; // 0 / 5
byte r1[8] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000
}; // 1 / 5
byte r2[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000
}; // 2 / 5
byte r3[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100
}; // 3 / 5
byte r4[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110
}; // 4 / 5
byte r5[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
}; // 5 / 5
 
/* Fonction retournant le n° de bouton appuyé */
byte read_button(void) {
 
  /* Lecture de l'entrée A0 */
  unsigned int val = analogRead(A0);
 
  /* Test suivant les fourchettes de valeurs */
  if (val > 1000) return BP_NONE;
  if (val < 50) return BP_RIGTH; 
  if (val < 195) return BP_UP;
  if (val < 380) return BP_DOWN;
  if (val < 555) return BP_LEFT;
  if (val < 790) return BP_SELECT;
 
  /* Par défaut aucun bouton n'est appuyé */
  return BP_NONE;
 
}
 
/* Fonction dessinant le bargraph */
void draw_bargraph(byte percent) {
  byte i, cp, cl;
 
  /* Affiche la nouvelle valeur*/
  lcd.setCursor(0, 0);
  lcd.print(percent);
  lcd.print(" %   ");
 
  /* Déplace le curseur */
  lcd.setCursor(0, 1);
 
  /* Map percent de (0 ~ 100) vers (0 ~ 80) ( 1 char = 5 colonnes, 16 * 5 = 80) */
  percent = map(percent, 0, 100, 0, 80);
 
  /* Calcul le nombre de cases pleines et le nombre de colonnes dans la dernière case */
  cp = percent / 5;
  cl = percent % 5;
 
  /* Dessine les cases pleines */
  for(i = 0; i < cp; ++i)
    lcd.write(5);
 
  /* Dessine la dernière case */
  lcd.write(cl);
 
  /* Dessine les cases vides restantes */
  for(i = 0; i < 16 - (cp + (cl ? 1 : 0)); ++i)
    lcd.write((uint8_t)0);
}
 
/* setup() */
void setup(){
 
  /* Enregistre les caractères personnalisés dans le lcd */
  lcd.createChar(0, r0);
  lcd.createChar(1, r1);
  lcd.createChar(2, r2);
  lcd.createChar(3, r3);
  lcd.createChar(4, r4);
  lcd.createChar(5, r5);
 
  /* Initialise le lcd */
  lcd.begin(16, 2);
  lcd.clear();
   
  /* Départ à 0% */
  draw_bargraph(0);
}
 
/* loop() */
void loop(){
 
  /* Valeur en % du bargraph */
  static byte percent = 0;
 
  /* Indique si la valeur a été modifiée */
  byte changed = true;
 
  /* Lit les boutons et agis en conséquence */
  switch(read_button()) {
  case BP_UP:
    percent = 100;
    break;
 
  case BP_DOWN:
    percent = 0;
    break;
 
  case BP_LEFT:
    if(percent != 0)
      percent--;
    break;
 
  case BP_RIGTH:
    if(percent != 100)
      percent++;
    break;
 
  case BP_NONE:
    changed = false;
    break;
  }
 
  /* Si la valeur a été modifié */
  if(changed) {
 
    /* Dessine le nouveau bargraph*/
    draw_bargraph(percent);
 
    /* Refresh 2Hz */
    delay(500);
  }
}

 

 

niki43
Offline
Зарегистрирован: 19.02.2014

подскажите пожалуйста на какие пины подключать GSM модуль, я использую arduino uno

yarus
Offline
Зарегистрирован: 17.06.2017

В RX и TX.

Питание же должно быть ОБЯЗАТЕЛЬНО отдельным, поскольку  енти модули весьма прожорливы.

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

надеюсь уважаемый brdm не сам писал этот треш, а скопипастил его. жесть. все это можно сделать намного интреснее и менее ресурсоемко. даже написал библиотеку которая поддерживает горизонтальную полосу. подробности тут - Универсальная библиотека LiquidCrystal_I2C на базе расширителя портов PCF8574

пример полосы тут - AudioLevelBar

а вот как выглядит сама функция printHorizontalGraph из библиотеки

void LiquidCrystal_I2C::printHorizontalGraph(char name, uint8_t row, uint16_t currentValue, uint16_t maxValue)
{
    uint16_t currentGraph = 0;
    uint8_t  colum        = 0;

    if (currentValue > maxValue) currentValue = maxValue;

    currentGraph = map(currentValue, 0, maxValue, 0, _lcd_colums);

    setCursor(colum, row);
    send(LCD_DATA_WRITE, name, LCD_CMD_LENGTH_8BIT);

    /* draw the horizontal bar without clearing the display, to eliminate flickering */
    for (colum = 1; colum < currentGraph; colum++)
    {
      setCursor(colum, row);
      send(LCD_DATA_WRITE, 0xFF, LCD_CMD_LENGTH_8BIT); //print 0xFF - built in "solid square" char. see p.17 & p.30 of HD44780 datasheet
    }

    /* fill the left overs (from the previous draw) with spaces */
    for (colum; colum < _lcd_colums; colum++)
    {
      send(LCD_DATA_WRITE, 0x20, LCD_CMD_LENGTH_8BIT); //print 0x20 - built in "space" char. see p.17 & p.30 of HD44780 datasheet
    }
}

как говорится - "когда мало мозгов, то много железа".

 

rr_rashit
Offline
Зарегистрирован: 27.10.2013

Добрый день!

Есть готовый скейтч?