GSM модуль + Arduino + LCD = уровень сигнала в виде полосы, процента
- Войдите на сайт для отправки комментариев
Ср, 28/01/2015 - 12:04
Всем привет! Нужна помощь.
Руки есть, все необходимое вроде тоже есть. (LCD ACM1602BE-FL-YTH-QM13; Arduino nano (есть на разбор PIC контроллеры и некоторые ATmel); GSM модуль, чуть позже напишу какие SIM900, ... )
Задача: Соеденить GSM модуль c Arduino и LCD + добавить кнопку перезагрузки и переключения SIM карт. И получать уровень сигнала в виде полосы, процента и баллы до 32.



Зарание спасибо за помошь
"полоска" барграф заточена по 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); } }подскажите пожалуйста на какие пины подключать GSM модуль, я использую arduino uno
В RX и TX.
Питание же должно быть ОБЯЗАТЕЛЬНО отдельным, поскольку енти модули весьма прожорливы.
надеюсь уважаемый 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 } }как говорится - "когда мало мозгов, то много железа".
Добрый день!
Есть готовый скейтч?