Сязка DS3231+Nano+NEOWAY M590+DHT22
- Войдите на сайт для отправки комментариев
Уважаемые форумчане, всю голову сломал. Есть озаглавленное железо и рабочий скетч. Питание от 12v 2А на- 3,5в через конденсатор 3300мф (без диода который изначально шел с конструктором). Подключение линий ввода/вывода (RXD, TXD,) модема организовано по даташиту (поставил диод 1n5819 и пару резистров). Вобщем то все работает, КРОМЕ часов. Как только задействую модуль DS3231 ардуина виснет, как только отключаю шлет показания с температурой дальше. Прошу помощи может кто что знает.
Да вот еще что странно в даташите сказано что (Напряжения на линиях ввода (RXD, DTR) не должны превышать 3,3В) я замерял, у меня доходит до 3.85в
Питаю их раздельно, на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.
на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.
И не жалко Вам его? по датащиту положено от 3.3 до 4.5... а как Вы часы подключаете то?
на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.
И не жалко Вам его? по датащиту положено от 3.3 до 4.5... а как Вы часы подключаете то?
Я ж написал: идет 12в потом преобразователь до 4.2в ну и конденсатор 3300мф. Модем в итоге от положеных вольтов питается. Часы подключаю к ардуино и питание и связь.
Часы неисправны и завешивают обмен по шине I2С? - как вариант.
Спасибо, с этой ардуиной отдельно часы работают.
Ну тогда бросайте скетч - посмотрим.
Вот он, но вот например на УНО он работал, а на НАНО не хотит!
#include <DS3231.h> #include "DHT.h" #define DHTPIN 7 #define gsm Serial #define DHTTYPE DHT22 #define pinBOOT 5 // нога BOOT или K на модеме DHT dht(DHTPIN, DHTTYPE); DS3231 rtc(SDA, SCL); int channel; int value; String atcusd = ("at+cusd=1,\"*99***1#\",15"); Time t; unsigned long time; void gprssend(){ // функция отправляет данные на фтп сервер t = rtc.getTime(); char tim[6]; // собераем массив для отправки char tem[6]; char hum[6]; float T = dht.readTemperature(); // считаем данные с градусника float H = dht.readHumidity(); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); //преобразует float значение в строчку dtostrf(T, 5, 1, tem); dtostrf(H, 5, 1, hum); snprintf(tim, sizeof(tim),"%d:%d",(t.hour),(t.min)); snprintf(tem, sizeof(tem),"%s",tem); snprintf(hum, sizeof(hum),"%s",hum); // проверяем соединины ли с интернетом gsm.flush(); gsm.println("at+xiic?"); delay(100); if (gsm.find("0.0.0.0")) gprsconnect(); // если нет, то подключаемся gsm.flush(); gsm.println("AT+FTPLOGOUT"); // на всякий случай разлогиниваемся delay(1000); gsm.flush(); // соединяемся с FTP и отправляем массив в файл gsm.println("**************************************************"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР! while(!gsm.find("+FTPLOGIN")); // в цикле ждем ответ delay(100); gsm.println("AT+FTPPUT=test.csv,1,2,16"); // открываем файл delay(1000); gsm.print(tim); // пишим в файл массив gsm.print(tem); // пишим в файл массив gsm.println(hum); // пишим в файл массив delay(300); while(!gsm.find("+FTPPUT:")){ // ждем ответ Serial.print("."); delay(1000); } Serial.println("FTP send"); // отписываемся что отправили delay(100); gsm.println("AT+FTPLOGOUT"); // разлогиниваемся } void gprsconnect(){ // отправляем настройки GPRS и подключаемся. gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\""); delay(100); gsm.println("AT+XGAUTH=1,1,\"beeline\",\"beeline\""); delay(100); gsm.println("AT+CUSD=1,\"*99***1#\",15"); delay(100); gsm.println("AT+XISP=0"); // включаем РРР delay(100); gsm.println("at+xiic=1"); delay(100); do{ // ждем IP gsm.println("at+xiic?"); Serial.print("."); delay(300); }while(gsm.find("0.0.0.0")); } void modemOFF(){ gsm.println("AT+CPWROFF"); delay(300); digitalWrite(pinBOOT, HIGH); delay(100); } void setup() { Serial.begin(4800); gsm.begin(4800); gsm.println("ATE1"); pinMode(pinBOOT, OUTPUT); // нога BOOT на модеме digitalWrite(pinBOOT, LOW); do{ // проверяем готовность модема gsm.println("AT+CPAS"); Serial.print("."); delay(500); }while(!gsm.find("0")); do{ gsm.println("AT+CREG?"); Serial.print(":"); delay(500); }while(!gsm.find("+CREG: 0,1")); delay(100); gsm.flush(); gprsconnect(); // соединяемся с инетом } void loop() { digitalWrite(pinBOOT, LOW); delay(500); while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); //или ("AT+CPAS"); if (gsm.find("+COPS: 0")) break; delay(500); } delay(100); gprssend(); delay(500); modemOFF(); delay(100); Serial.println("***********"); delay(60000); }Последовательность действий - убираем в скетче строку 22. Смотрим, что получится - если данные не приходят вообще, значит проблема в службе времени приемника, если данные продолжают приходить, но с замершим временем и неправильным, то подключаем часики - если данные продолжают приходить с замершим временем - значит дело чисто в чтении и будем смотреть его, если прекращают приходить - значит дело в часиках.
Вобщем закоментил строчку, подключил часы. Диод на часах горит (питание есть). Данные не приходят вообще. Т.Е. приходят 0:0 24.8 37.8 Время понулям!
Sasha80, сколько устрогйств у Вас висит на шине I2C? Эти устройства в виде отдельных микросхем или в виде готовых плат? Если второе, какие номиналы резисторов на SDA и SCL в каждом из устройств?
Ребята всем спасибо за отзывчивость! Поднял свой предидущий скетч, маленько подправил и все закрутилось!
?Bот этот работает: (Кстати в я так и не разобрался с тем скетчем, почему он вешался на часах)
#include <DS3231.h> #include "DHT.h" #define DHTPIN 7 #define gsm Serial #define DHTTYPE DHT22 #define pinBOOT 5 // нога BOOT или K на модеме DHT dht(DHTPIN, DHTTYPE); DS3231 rtc(SDA, SCL); int channel; int value; String atcusd = ("at+cusd=1,\"*99***1#\",15"); Time t; unsigned long time; void modemread() { for (int i=0; i <= 6000; i++) { if (gsm.find("OK") == true); { goto label1; } Serial.println(gsm.readString()); //Надо оставить либо эту строчку, либо следующую Serial.println. Пока не проверял. Должна выводить в Serial сведения об ошибке. delay(50); } //Serial.println(gsm.readString()); setup(); label1: delay(1); } void gprsconnect() { gsm.println("ATE0"); modemread(); gsm.println("AT&D2"); modemread(); gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\""); modemread(); gsm.println("AT+CLIP=1"); modemread(); gsm.println(atcusd); modemread(); gsm.println("at+xisp=0"); modemread(); gsm.println("at+xiic=1"); modemread(); for (int i=0; i <= 5000; i++) { gsm.println("at+xiic?"); if (gsm.find("0.0.0.0") == false); { goto label2; } delay(100); } label2: gsm.println("at+xiic?"); delay(100); Serial.println(gsm.readString()); } void gprssend(){ t = rtc.getTime(); char tim[6]; // собераем массив для отправки char tem[6]; char hum[6]; float T = dht.readTemperature(); float H = dht.readHumidity(); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); преобразует float значение в строчку dtostrf(T, 5, 1, tem); dtostrf(H, 5, 1, hum); snprintf(tim, sizeof(tim),"%d:%d",(t.hour),(t.min)); snprintf(tem, sizeof(tem),"%s",tem); snprintf(hum, sizeof(hum),"%s",hum); // проверяем соединины ли с интернетом gsm.println("at+xiic?"); delay(100); while (gsm.find("0.0.0.0")) { gprsconnect(); } gsm.println("AT+FTPLOGOUT"); modemread(); // на всякий случай разлогиниваемся // соединяемся с FTP и отправляем массив в файл gsm.println("AT+FTPLOGIN=***************************************"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР! while(!gsm.find("+FTPLOGIN")); delay(100); /* for (int i=0; i <= 100; i++){ delay(100); if (gsm.available()>0) { Serial.println(gsm.readString()); } if (gsm.find("AT+FTPLOGIN: User logged in")) { goto label; } } setup(); label: */ gsm.println("AT+FTPPUT=test.csv,1,2,16"); // открываем файл delay(1000); gsm.print(tim); // пишим в файл массив gsm.print(tem); // пишим в файл массив gsm.println(hum); // пишим в файл массив delay(100); while(!gsm.find("+FTPPUT:")){ // ждем ответ Serial.print("."); delay(1000); } Serial.print("FTP send"); // отписываемся что отправили delay(1000); gsm.println("AT+FTPLOGOUT"); // разлогиниваемся } void modemOFF(){ gsm.println("AT+CPWROFF"); delay(300); digitalWrite(pinBOOT, HIGH); delay(100); } void setup() { dht.begin(); rtc.begin(); Serial.begin(4800); gsm.begin(4800); pinMode(pinBOOT, OUTPUT); // нога BOOT на модеме digitalWrite(pinBOOT, LOW); do { // проверяем готовность модема gsm.println("AT+CPAS"); Serial.print("."); delay(100); } while (!gsm.find("0")); do { gsm.println("AT+CREG?"); Serial.print(":"); delay(100); } while (!gsm.find("+CREG: 0,1")); gprsconnect(); //gprssend(); } void loop() { digitalWrite(pinBOOT, LOW); delay(500); Serial.print("START"); while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); //или ("AT+CPAS"); if (gsm.find("+COPS: 0")) break; delay(500); } delay(100); gprssend(); delay(500); modemOFF(); delay(60000); }Вот только что непонятно. На команду 53строка - gsm.println("at+xiic?"); В монитор портв выводит