Сязка DS3231+Nano+NEOWAY M590+DHT22

Sasha80
Offline
Зарегистрирован: 18.01.2016

Уважаемые форумчане, всю голову сломал. Есть озаглавленное железо и рабочий скетч. Питание от 12v 2А на- 3,5в через конденсатор 3300мф (без диода который изначально шел с конструктором). Подключение линий ввода/вывода (RXD, TXD,) модема организовано по даташиту (поставил диод 1n5819 и пару резистров). Вобщем то все работает, КРОМЕ часов. Как только задействую модуль DS3231 ардуина виснет, как только отключаю шлет показания с температурой дальше. Прошу помощи может кто что знает.

Да вот еще что странно в даташите сказано что (Напряжения на линиях ввода (RXD, DTR) не должны превышать 3,3В) я замерял, у меня доходит до 3.85в

Питаю их раздельно, на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Sasha80 пишет:

на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.

И не жалко Вам его? по датащиту положено от 3.3 до 4.5... а как Вы часы подключаете то?

Sasha80
Offline
Зарегистрирован: 18.01.2016

Mr.Privet пишет:

Sasha80 пишет:

на модем идет 12в 2А, Нано от ЮСБ компьютера. Соеденени между собой минусами.

И не жалко Вам его? по датащиту положено от 3.3 до 4.5... а как Вы часы подключаете то?

 

Я ж написал: идет 12в потом преобразователь до 4.2в ну и конденсатор 3300мф. Модем в итоге от положеных вольтов питается. Часы подключаю к ардуино и питание и связь.

GarryC
Offline
Зарегистрирован: 08.08.2016

Часы неисправны и завешивают обмен по шине I2С? - как вариант.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Спасибо,  с этой ардуиной отдельно часы работают.

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну тогда бросайте скетч - посмотрим.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Вот он, но вот например на УНО он работал, а на НАНО не хотит!


#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); 
}

 

GarryC
Offline
Зарегистрирован: 08.08.2016

Последовательность действий - убираем в скетче строку 22. Смотрим, что получится - если данные не приходят вообще, значит проблема в службе времени приемника, если данные продолжают приходить, но с замершим временем и неправильным, то подключаем часики - если данные продолжают приходить с замершим временем - значит дело чисто в чтении и будем смотреть его, если прекращают приходить - значит дело в часиках.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Вобщем закоментил строчку, подключил часы. Диод на часах горит (питание есть). Данные не приходят вообще. Т.Е. приходят 0:0 24.8 37.8    Время понулям!

"проблема в службе времени приемника"- это что?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sasha80, сколько устрогйств у Вас висит на шине I2C? Эти устройства в виде отдельных микросхем или в виде готовых плат? Если второе, какие номиналы резисторов на SDA и SCL в каждом из устройств?

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ребята всем спасибо за отзывчивость! Поднял свой предидущий скетч, маленько подправил и все закрутилось!

?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); 
}
Sasha80
Offline
Зарегистрирован: 18.01.2016

Вот только что непонятно. На команду    53строка - gsm.println("at+xiic?");  В монитор портв выводит 

at+xiic?
OK
+XIIC:    0, 0.0.0.0
OK
И дальше все продолжает работать как надо. Я так понимпю IP он все таки получает, а выводит нули. Подскажите может что подправить чтобы в монитор выводил правильно состояние получения IP по этой команде!