#define VREF 4.1 // точное напряжение на пине 5V (в данном случае зависит от стабилизатора на плате Arduino)
#define DIV_R1 8200 // точное значение 10 кОм резистора
#define DIV_R2 5000 // точное значение 4.7 кОм резистора
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 9 // точность измерений (9 ... 12)
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void showStartupMessage() {
lcd.setCursor(0, 0);
lcd.print(" RSSI TORNADO ");
delay(1000);
lcd.setCursor(0, 1);
String message = " Satcom Pirates";
for (byte i = 0; i < message.length(); i++) {
lcd.print(message[i]);
delay(100);
}
delay(500);
}
void CreateBar(int h){
byte result[8] ={
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
};
int i=0;
while(i<=h){
result[7-i]=B11111;
i++;
}
lcd.createChar(h+1, result);
}
void CreateBars(){
for (int i=0;i<8;i++){
CreateBar(i);
}
}
void setup() {
sensor.begin(); // инициализация DS18B20
sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
sensor.setResolution(Thermometer, TEMPERATURE_PRECISION);// установка точности измерения 9...12 разрядов
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
CreateBars();
showStartupMessage();
delay(100);
lcd.clear();
lcd.setCursor(0, 1); lcd.print("--.--V");
}
int analogPort=0;
int rssi=0;
int getValueRangeIndex(int analogValue){
int pointsCount=16;
int valueMatrix[pointsCount]={
// Настроить 16 контрольных точек под свою станцию. Диапазон от 0 до 1023:
170,
180,
190,
200,
210,
220,
230,
240,
250,
260,
270,
280,
290,
300,
310,
320
};
for (int j =0; j < pointsCount; j++) {
int point=valueMatrix[j];
if(analogValue<=point){
return j;
}
}
return pointsCount;
}
void blocksString(int s){
lcd.setCursor(0, 0);
for(int i=0;i<=s;i++){
if (i==8){
lcd.print(5); // пятерка
} else if(i==11){
lcd.print(9); // девятка
}else{
lcd.write(min(8,i));
}
lcd.setCursor(i, 0);
}
for (int j=s;j<16;j++){
lcd.setCursor(j, 0);
lcd.print(" ");
}
}
int prevRssi=0;
float prevVoltage=0;
long line1Time=0;
long line2Time=0;
int line1refreshPeriod=200;// как часто обновлять 1 строку
int line2refreshPeriod=2000;// как часто обновлять 2 строку
void loop() {
prevRssi=rssi;
rssi=analogRead(analogPort);
bool refreshLine1=millis()-line1Time>line1refreshPeriod;
bool refreshLine2=millis()-line2Time>line2refreshPeriod;
if (prevRssi!=rssi){
int strength=getValueRangeIndex(rssi);
if (refreshLine1){
blocksString(strength);
line1Time=millis();
}
}
if (refreshLine2){
lcd.setCursor(13, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(rssi);
line2Time=millis();
}
//вольтметр
float voltage = (float)analogRead(A1) * VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024;
if (voltage!=prevVoltage){
prevVoltage=voltage;
lcd.setCursor(0, 1); lcd.print(voltage);
}
static uint32_t tmr;
if (millis() - tmr >= 1000) {
tmr = millis();
lcd.setCursor(7, 1);
sensor.setWaitForConversion(false);
sensor.requestTemperatures();
sensor.setWaitForConversion(true);
lcd.print(sensor.getTempC(Thermometer)); // температура в градусах Цельсия
}
}